Java中的运行时依赖性如何正常工作。例如,如果Impl1
或Impl2
在运行时不在类路径中,则可能是这样的代码:
Thinger t;
if (classIsAvailable(Impl1.class)) t = new Impl1();
else t = new Impl2();
t.doThing();
或者如果没有通用接口:
if (classIsAvailable(Impl1.class)) Impl1.doThingThisWay();
else Impl2.doThingTheOtherWay();
答案 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)
当您的类加载Impl1
或Impl2
而不在类路径中时,您的示例将失败NoClassDefFoundError
,因此在这种情况下不会执行任何代码。