URLClassLoader抛出No Class Definition found exception

时间:2011-10-04 18:35:25

标签: java urlclassloader

我有3个Java项目A,B和C. B就像A的附加组件。对于某些类,A和B都依赖于项目C.

现在在项目A中,当我使用URLClassLoader时如下:

URLClassLoader ucl = new URLClassLoader(urls); //urls are paths to some classes in B

现在使用这些ucl时,当我在B中调用某些方法时,它会给我找不到类定义异常。这是一个C类。

现在我按如下方式使用ClassLoader:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URLClassLoader ucl = new URLClassLoader(urls, classLoader);

当我在B中调用方法时,这很好用。 我的问题:

1)当我第一种方式,使用哪种ClassLoader时?我读了JavaDocs,但找不到任何我能解释的东西 2)有没有办法获得一个特定于项目B的ClassLoader,我可以以某种方式使用,这样我就不会遇到任何依赖性问题?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

默认的类加载器是系统类加载器(在类路径上加载类)。

如果使用特定的类加载器在B中加载类,请使用该实例。否则someTypeInB.getClass().getClassLoader()将作为黑客攻击。

(注意:使用URLClassLoader.newInstance通常比new URLClassLoader更好,因为它增加了与不受信任的代码一起使用所需的安全措施(尽管不是很充分)。同样使用线程上下文类加载器通常一个坏主意 - 你引入了对本地代码的依赖,但是线程被设置和使用[无论如何可能没有应用任何连贯的策略]。)

答案 1 :(得分:1)

当你使用你的第一个URLClassLoader时,那个只用B的路径初始化的那个,那么如果B中的某个东西需要在C中解决某些东西以便加载,它就会变短。通过使用第二种形式,您会说“如果您在这里找不到所需内容,请查看'父级'类加载器。”这样可以解决C问题,每个人都很开心。

(理解唯一可以在不引用其他类的情况下加载的类是Object - 甚至这是一个延伸。它不仅仅是你需要引用类的超类 - 基本JDK中的对象,至少可以是通过系统类加载器引用,即使没有父CL - 但如果你调用另一个类的任何方法或操纵指向另一个类或任何此类事物的指针,你需要解析该引用的类。)