在Java中修改默认类加载器的行为
我试图使用自定义逻辑加载单个类(即,我想用自定义版本替换库中的类实现) 我想创建自己的自定义类加载器,它代理默认的类加载器。 但是,我的默认类加载器:在Java中修改默认类加载器的行为,java,classloader,Java,Classloader,我试图使用自定义逻辑加载单个类(即,我想用自定义版本替换库中的类实现) 我想创建自己的自定义类加载器,它代理默认的类加载器。 但是,我的默认类加载器:sun.misc.Launcher.AppClassLoader似乎不可见,这意味着我无法扩展它 任何创建单个类加载器的解决方案,只要足够健壮,可以复制我现有的类加载器的行为,同时在一个特定的类中进行子绑定,都会非常感激 请注意,我已尝试使用 Thread current = Thread.currentThread(); current.setC
sun.misc.Launcher.AppClassLoader
似乎不可见,这意味着我无法扩展它
任何创建单个类加载器的解决方案,只要足够健壮,可以复制我现有的类加载器的行为,同时在一个特定的类中进行子绑定,都会非常感激
请注意,我已尝试使用
Thread current = Thread.currentThread();
current.setContextClassLoader(newOne);
但是,这似乎不起作用,即线程中加载的类并不总是触发我的自定义类加载器
上下文
我希望调用“new LibraryClass()”来使用该类的自定义实现,其中“new…”调用位于我无法控制的jar文件中 所以,我认为您想用使用相同的完全限定名的自定义版本替换
LibraryClass
,对吗
如果原始的LibraryClass
已经在类路径上,那么由于类加载器层次结构的原因,使用自定义类加载器将不可能做到这一点(请参阅)
一种可能的解决方案是将包含自定义LibraryClass
的jar放在类路径的最开头。然后将加载您的自定义类,以支持原始类
如果
LibraryClass
是引导类或扩展类,这将不起作用。如何使用URLClassLoader
?您可以将修改后的LibraryClass
版本添加到其余版本的前面,以便类装入器首先找到它。或者重写findClass
。