究竟是什么时候抛出NoClassDefFoundError?

时间:2011-05-05 10:02:57

标签: java dependencies runtime classpath

Java中的运行时依赖性如何正常工作。例如,如果Impl1Impl2在运行时不在类路径中,则可能是这样的代码:

Thinger t;
if (classIsAvailable(Impl1.class)) t = new Impl1();
else t = new Impl2();
t.doThing();

或者如果没有通用接口:

if (classIsAvailable(Impl1.class)) Impl1.doThingThisWay();
else Impl2.doThingTheOtherWay();

3 个答案:

答案 0 :(得分:3)

你不能完全这样做,因为为了评估Impl1.class,所述类必须可用(即加载)。但是,您可以尝试按名称

加载特定的类
 Class aClass = classLoader.forName("Impl1");

如果这不会失败(抛出异常),您可以使用newInstance()创建此类的实例。

当然,为了能够使用您的类,您必须确保它实现了一个接口,在编译时 已知。在这种情况下,您可以将创建的对象强制转换为该接口类型并继续使用它。

This article有一些示例代码。

答案 1 :(得分:2)

当抛出ClassNotFoundException时 应用程序尝试使用以下命令通过其字符串名称加载类:

* The forName method in class Class.
* The findSystemClass method in class ClassLoader .
* The loadClass method in class ClassLoader. 

但是找不到具有指定名称的类的定义。

您可能还会发现http://www.xyzws.com/javafaq/what-does-classforname-method-do/17有用。

HTH

答案 2 :(得分:0)

当您的类加载Impl1Impl2而不在类路径中时,您的示例将失败NoClassDefFoundError,因此在这种情况下不会执行任何代码。