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
的方法少得多)
我有以下代码:
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
的方法少得多)