SomeClass.class 是不是被视为没有运行时耦合的常量?
Posted
技术标签:
【中文标题】SomeClass.class 是不是被视为没有运行时耦合的常量?【英文标题】:Is SomeClass.class considered a constant with no runtime coupling?SomeClass.class 是否被视为没有运行时耦合的常量? 【发布时间】:2018-04-23 06:45:21 【问题描述】:我有以下代码:
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
的值是否作为常量提供,其值是在构建字节码时确定的?或者如果该类不可用,我会得到某种运行时异常吗?
【问题讨论】:
如果PluginApple
类不是类路径的一部分,那么在执行Manager.getPlugins(PluginApple.class);
时会得到ClassNotFoundError
。
【参考方案1】:
但是现在让我们说 PluginApple 在运行时不可用。 PluginApple.class 的值是否作为常量提供,其值是在构建字节码时确定的?
没有。它是一个类文字,表示java.lang.Class
类型的对象。评估方法调用需要创建该对象,而这又需要加载指定的类。
如果该类不可用,我会得到某种运行时异常吗?
您将收到NoClassDefFoundError
。 (很好。获得Error
的方法比获得Exception
的方法少得多)
【讨论】:
以上是关于SomeClass.class 是不是被视为没有运行时耦合的常量?的主要内容,如果未能解决你的问题,请参考以下文章