在运行时加载.jars:我的加载器工作,但使用setContextClassLoader不行?

时间:2009-07-03 04:31:15

标签: java jar classloader urlclassloader

我有一个名为“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的工作原理。任何人都可以向我澄清并帮助我理解它 - 我该怎么做才能使我的代码工作?谢谢。

1 个答案:

答案 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)