我正在尝试使用自定义逻辑加载单个类(即我想用自定义版本替换库中类的实现)。
我想创建自己的自定义类加载器,它代理默认的类加载器。
但是,我的默认类加载器sun.misc.Launcher.AppClassLoader
似乎不可见 - 这意味着我无法扩展它。
任何用于创建单个类加载器的解决方案都非常受欢迎,该类加载器足够强大,能够复制现有类加载器的行为,同时在一个特定的类中进行修改。
请注意,我已尝试使用
Thread current = Thread.currentThread();
current.setContextClassLoader(newOne);
但是,这似乎不起作用,即线程中加载的类并不总是触发我的自定义类加载器。
背景
我希望调用“new LibraryClass()”来使用此类的自定义实现 - 其中“new ...”调用位于不受我控制的jar文件中。
答案 0 :(得分:0)
因此,我认为您希望使用相同的完全限定名称替换自定义版本的LibraryClass
,对吧?
如果原始LibraryClass
已经在类路径上,由于类加载器层次结构,使用自定义类加载器将无法执行此操作(请参阅The Java Class Loading Mechanism)。
一种可能的解决方案是将包含自定义LibraryClass
的jar放在类路径的最开头。然后,您的自定义类将被加载为原始类。
如果LibraryClass
是引导程序或扩展类,则无效。