在运行时加载 .jar:我的加载器可以工作,但使用 setContextClassLoader 却不能?

发布于 2024-07-26 21:49:09 字数 670 浏览 11 评论 0原文

我有一个名为“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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

屋顶上的小猫咪 2024-08-02 21:49:09

public static Class forName(String className)
抛出 ClassNotFoundException

返回与具有给定字符串名称的类或接口关联的 Class 对象。 调用该方法相当于:

Class.forName(className, true, currentLoader)
其中 currentLoader 表示当前类的定义类加载器。

尝试:

Class.forName("MyClass", true, MyClassLoader);

[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)

public static Class forName(String className)
throws ClassNotFoundException

Returns the Class object associated with the class or interface with the given string name. Invoking this method is equivalent to:

Class.forName(className, true, currentLoader)
where currentLoader denotes the defining class loader of the current class.

Try:

Class.forName("MyClass", true, MyClassLoader);

[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)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文