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 是不是被视为没有运行时耦合的常量?的主要内容,如果未能解决你的问题,请参考以下文章

EasyMock:如何在没有警告的情况下创建泛型类的模拟?

SQL列AVG()被视为字符串而不是按DESC排序

向数百个站点发出 curl 请求是不是会被某些主机视为攻击?

Access 2007 文本框被视为空,而实际上不是

没有 __init__.py,但仍被视为一个包?

使用属性路由定义的路径模板是不是被视为硬编码?