在运行时加载 .jar:我的加载器可以工作,但使用 setContextClassLoader 却不能?
我有一个名为“MyClassLoader”的 URLClassLoader,上面设置了一些 jar。 如果我尝试
MyClassLoader.loadClass("MyClass");
它会起作用。
如果我尝试
Thread.currentThread().setContextClassLoader(MyClassLoader);
Thread.currentThread().getContextClassLoader().loadClass("MyClass");
它也有效。
但如果我尝试
Thread.currentThread().setContextClassLoader(MyClassLoader);
Class.forName("MyClass");
它会抛出 ClassNotFoundException 。
当然,这里的Class.forName
只是一个例子; 尝试使用 MyClass 也会引发异常。
所有这些可能意味着我不明白 setContextClassLoader 是如何工作的。 谁能向我澄清这一点并帮助我理解它 - 我应该做什么才能使我的代码正常工作? 谢谢。
I have an URLClassLoader named "MyClassLoader" set up with some jars on it.
If I try
MyClassLoader.loadClass("MyClass");
it works.
If I try
Thread.currentThread().setContextClassLoader(MyClassLoader);
Thread.currentThread().getContextClassLoader().loadClass("MyClass");
it also works.
But If I try
Thread.currentThread().setContextClassLoader(MyClassLoader);
Class.forName("MyClass");
it throws a ClassNotFoundException
.
Of course, Class.forName
here is just an example; trying to use MyClass
throws the exception just as well.
All this probably means I don't understand how setContextClassLoader
works. Could anyone clarify this to me and help me understand it - and what should I do to make my code work? Thank you.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
尝试:
[Class.forName(String, boolean, ClassLoader][1]
您遇到的可能问题是您正在尝试 forName 一个使用自定义 ClassLoader 加载的类。但是,您正在使用隐式的 forName 形式使用加载类的类加载器进行调用。在大多数情况下,系统类加载器可能会
复杂。
变得 docs/api/java/lang/Class.html#forName(java.lang.String" rel="nofollow noreferrer">http://java.sun.com/javase/6/docs/api/java/lang/Class .html#forName(java.lang.String, 布尔值, java.lang.ClassLoader)
Try:
[Class.forName(String, boolean, ClassLoader][1]
The likely problem you are encountering is that you are trying to forName a Class that you loaded with a custom ClassLoader. However, you are using the form of forName that implicitly uses the ClassLoader which loaded the Class making the call. In most cases, this will be the system ClassLoader.
ClassLoaders can get complex.
[1]: http://java.sun.com/javase/6/docs/api/java/lang/Class.html#forName(java.lang.String, boolean, java.lang.ClassLoader)