【问题标题】:Java: Why method type in .class file contains return type, not only signature?Java:为什么.class文件中的方法类型包含返回类型,而不仅仅是签名?
【发布时间】: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 没有。

我说的对吗?

谢谢。

【问题讨论】:

    标签: jvm java


    【解决方案1】:

    一个原因可能是因为方法重载(而不是覆盖)是在编译时确定的。考虑以下方法:

    public void doSomething(List util) {}
    
    public void doSomething(ArrayList util) {}
    

    并考虑代码:

    doSomething(getList());
    

    如果 Java 允许更改返回类型并且没有抛出异常,那么在重新编译之前,调用的方法仍然是 doSomething(List) - 那么它将是 doSomething(ArrayList)。这意味着工作代码会因为重新编译而改变行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 2013-04-15
      • 2012-10-18
      • 2023-03-26
      • 1970-01-01
      • 2018-11-19
      相关资源
      最近更新 更多