Java加载一个类_java – 如何控制哪个ClassLoader加载一个类?

手头的情况并不像标题似乎表明的那么简单.

Java 1.6_17通过JWS运行.

我有一个类,让我们说MyClass和它的一个实例成员变量是来自错误的第三方库的Type,在类初始化期间它动态地尝试使用Class.forName(String)加载它自己的一些类.在其中一种情况下,它恰好动态调用:Class.forName(“foo / Bar”).这个类名不遵循二进制名称的JLS,最终导致java.lang.NoClassDefFoundError:foo / Bar.

我们有一个自定义的ClassLoader,我已经为ClassLoader.findClass(String)和ClassLoader.loadClass(String)添加了一个sanitize方法来解决这个问题.

我可以称之为:

myCustomClassLoader.findClass( “富/酒吧”)

然后加载类没有任何问题.但即使我提前加载课程,我仍然会在以后获得异常.这是因为在MyClass初始化期间引用Bar – 它们的代码最终在某个静态块中调用Class.forName(“foo / Bar”).如果它试图使用的ClassLoader是我的自定义类加载器,那么这实际上是可以的.但事实并非如此.这是com.sun.jnlp.JNLPClassLoader没有做这样的卫生,因此我的问题.

我确保将Thread.currentThread().getContextClassLoader()设置为我的自定义类加载器.但是这(如你所知)没有效果.我甚至将它设置为我在main()中做的第一件事,因为我读过的东西,MyClass.class.getClassLoader() – 是JNLPClassLoader.如果我可以强迫它不是JNLPClassLoader而是使用我的,那么问题就解决了.

如何通过在类初始化期间进行的静态Class.forName(“foo / Bar”)调用来控制使用哪个ClassLoader加载类?我相信如果我可以强制MyClass.class.getClassLoader()返回我的自定义类加载器,我的问题将得到解决.

如果有人有想法,我愿意接受其他选择.

TL; DR:帮助我强制MyClass引用的第三方库中的所有Class.forName(String)调用 – 使用我选择的类加载器.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值