【发布时间】:2009-08-07 06:38:52
【问题描述】:
.class 文件的常量池中有一个“NameAndType”结构。 它用于动态绑定。 该类可以“导出”的所有方法都描述为“签名+返回类型”。 喜欢
"getVector()Ljava/util/Vector;"
当某些 .jar 中方法的返回类型发生更改时,这会破坏我的代码,即使新类型更窄。
即: 我有以下代码:
列表 l = some.getList();
外部 .jar 包含:
公共列表 getList()
比外部 jar 更改方法签名为
public ArrayList getList().
我的代码在运行时因 NoSuchMethodException 而死,因为它找不到
getList()Ljava/util/List;
所以,我必须重新编译我的代码。 我不必更改它。只需重新编译完全相同的代码!
这也提供了两种方法的能力 one 签名,但不同的返回类型!编译器不会接受它,但可以通过直接操作码来实现。
我的问题是为什么? 他们为什么这样做?
我只有一个想法:防止在运行时进行复杂的类型检查。 您需要查找层次结构并检查是否存在具有 List 接口的父级。 这需要时间,而且只有编译器才有。 JVM 没有。
我说的对吗?
谢谢。
【问题讨论】: