2009-07-03 68 views
2

我有一个名为“MyClassLoader”的URLClassLoader,它设置了一些jar。 如果我尝试在运行时加载.jars:我的加载程序工作,但使用setContextClassLoader不?

MyClassLoader.loadClass("MyClass"); 

它的工作原理。

如果我尝试

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

它也适用。

但如果我尝试

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

它抛出一个ClassNotFoundException

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

所有这可能意味着我不明白setContextClassLoader如何工作。任何人都可以向我澄清这一点,并帮助我理解它 - 我该怎么做才能让我的代码工作?谢谢。

回答

3

公共静态类的forName(字符串的className) 抛出ClassNotFoundException的

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

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

尝试:

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

[的Class.forName(字符串,布尔,类加载器] [1]

您所遇到的可能的问题是你想的forName一类,你加载了一个自定义的ClassLoader,但是,你使用的是forName形式,它隐式地使用加载了调用Class的ClassLoader,在大多数情况下,这将是系统ClassLoader。 rs可能变得复杂。

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

+0

是的,是的Class.forName中的安全编码指南部6列为出现异常行为依赖于呼叫者的类加载器的那些方法之一。不是那些依赖线程上下文类加载器的方法更好。聪明的事情是明确使用类加载器。 – 2009-07-03 10:57:18

相关问题