我有一个名为“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
的工作原理。任何人都可以向我澄清并帮助我理解它 - 我该怎么做才能使我的代码工作?谢谢。
答案 0 :(得分:3)
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的形式,它隐式使用加载了进行调用的Class的ClassLoader。在大多数情况下,这将是系统ClassLoader。
ClassLoaders可能变得复杂。
[1]:http://java.sun.com/javase/6/docs/api/java/lang/Class.html#forName(java.lang.String,boolean,java.lang.ClassLoader)