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

Is SomeClass.class considered a constant with no runtime coupling?

我有以下代码:

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

我想获得一个可能不可用的插件的引用。

例如,假设我这样做:

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

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

我可以这样做:

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

哪个可行,但如果 Manager.getPlugins() 根据 class 名称而不是字符串执行查找呢?

例如:

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

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

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

But now lets say that PluginApple is not available at runtime. Is the value of PluginApple.class provided as a constant whose value is determined when the byte code is built?

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

Or will I get some kind of runtime exception if the class is not available?

您将获得 NoClassDefFoundError。 (很好。获得 Error 的方法比获得 Exception 的方法少得多)