2

我有一个名为“MyClassLoader”的 URLClassLoader,上面有一些罐子。如果我尝试

MyClassLoader.loadClass("MyClass");

有用。

如果我尝试

Thread.currentThread().setContextClassLoader(MyClassLoader);
Thread.currentThread().getContextClassLoader().loadClass("MyClass");

它也有效。

但如果我尝试

Thread.currentThread().setContextClassLoader(MyClassLoader);
Class.forName("MyClass");

它抛出一个ClassNotFoundException.

当然,Class.forName这里只是一个例子;尝试使用MyClass也会引发异常。

这一切可能意味着我不明白它是如何setContextClassLoader工作的。谁能向我澄清这一点并帮助我理解它 - 我应该怎么做才能使我的代码正常工作?谢谢你。

4

1 回答 1

3

公共静态类 forName(String className) 抛出 ClassNotFoundException

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

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

尝试:

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

[Class.forName(String, boolean, ClassLoader][1]

您遇到的可能问题是您尝试为使用自定义 ClassLoader 加载的类命名。但是,您使用的 forName 形式隐式使用加载了调用的类的 ClassLoader。在大多数情况下,这将是系统 ClassLoader。

类加载器可能会变得复杂。

[1]: http://java.sun.com/javase/6/docs/api/java/lang/Class.html#forName(java.lang.String , boolean, java.lang.ClassLoader)

于 2009-07-03T07:37:45.570 回答