4

我正在尝试使用自定义逻辑加载单个类(即,我想用自定义版本替换我的库中的类的实现)。

我想创建自己的自定义类加载器,它代理默认类加载器。但是,我的默认类加载器: 似乎sun.misc.Launcher.AppClassLoader是不可见的——这意味着我无法扩展它。

任何用于创建单个类加载器的解决方案都将不胜感激,该类加载器足够健壮以复制我现有类加载器的行为,同时在一个特定类中进行替换。

请注意,我尝试过使用

Thread current = Thread.currentThread();
current.setContextClassLoader(newOne);

但是,这似乎不起作用,即线程中加载的类并不总是触发我的自定义类加载器。


语境

我希望调用“new LibraryClass()”来使用此类的自定义实现——其中“new ...”调用位于不受我控制的 jar 文件中。

4

1 回答 1

0

所以,我认为您想LibraryClass使用相同的完全限定名称替换自定义版本,对吗?

如果原始LibraryClass文件已经在类路径上,那么由于类加载器层次结构的原因,将不可能使用自定义类加载器执行此操作(请参阅Java 类加载机制)。

一种可能的解决方案是将包含您的 custom 的 jar 放在LibraryClass类路径的最开始。然后将加载您的自定义类以支持原始类。

LibraryClass如果是引导程序或扩展类,这将不起作用。

于 2013-07-05T19:48:06.210 回答