修改Java中默认类加载器的行为

时间:2013-06-30 18:48:29

标签: java classloader

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

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

任何用于创建单个类加载器的解决方案都非常受欢迎,该类加载器足够强大,能够复制现有类加载器的行为,同时在一个特定的类中进行修改。

请注意,我已尝试使用

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

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


背景

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

1 个答案:

答案 0 :(得分:0)

因此,我认为您希望使用相同的完全限定名称替换自定义版本的LibraryClass,对吧?

如果原始LibraryClass已经在类路径上,由于类加载器层次结构,使用自定义类加载器将无法执行此操作(请参阅The Java Class Loading Mechanism)。

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

如果LibraryClass是引导程序或扩展类,则无效。