在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