SomeClass.class被认为是没有运行时耦合的常量吗?

时间:2017-11-10 05:05:53

标签: java classname

我有以下代码:

BasePlugin p = Manager.getPlugins(...);

我想获得一个可能无法使用的插件的引用。

例如,假设我这样做:

BasePlugin p = Manager.getPlugins("PluginApple");

但是一段时间后,插件的名称更改为“PluginPear”。这将破坏任何硬编码前一个常量的代码。

我可以这样做:

try {
    SomePlugin p = Manager.getPlugins(PluginApple.getName());
}
catch (ClassNotFoundException ex) {
}

哪个有效但是如果Manager.getPlugins()基于类名而不是字符串执行查找呢?

例如:

BasePlugin p = Manager.getPlugins(PluginApple.class);

if (p != null)
   ((PluginApple)p).doSomething())

所以这就是问题:我可以构建一个知道PluginApple的jar,只要它可以在类路径中引用。但现在可以说PluginApple在运行时不可用。 PluginApple.class的值是作为常量提供的,其值是在构建字节代码时确定的吗?或者如果该类不可用,我会得到某种运行时异常吗?

1 个答案:

答案 0 :(得分:0)

  

但现在让我们说PluginApple在运行时不可用。 PluginApple.class的值是作为常量提供的,其值是在构建字节代码时确定的吗?

没有。它是表示类型为java.lang.Class的对象的类文字。评估方法调用需要创建该对象,而这又需要加载指定的类。

  

如果班级不可用,我会得到某种运行时异常吗?

您将获得NoClassDefFoundError。 (很好。获得Error的方式要少得多Exception