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