gpt4 book ai didi

jvm - Java:为什么.class文件中的方法类型包含返回类型,而不仅仅是签名?

转载 作者:搜寻专家 更新时间:2023-11-01 03:30:29 24 4
gpt4 key购买 nike

在.class文件的常量池中有一个“NameAndType”结构。它用于动态绑定(bind)。该类可以“导出”的所有方法都描述为“签名+返回类型”。喜欢

"getVector()Ljava/util/Vector;"

当某些 .jar 中方法的返回类型更改时,即使新类型更窄,也会破坏我的代码。

即:我有以下代码:

List l = some.getList();

外部 .jar 包含:

public List getList()

比外部 jar 将方法签名更改为

public ArrayList getList().

我的代码在运行时因 NoSuchMethodException 而死,因为它找不到

getList()Ljava/util/List;

所以,我必须重新编译我的代码。我不必更改它。只需重新编译完全相同的代码即可!

这也让我们能够拥有两个具有一个签名但返回类型不同的方法!编译器不会接受它,但可以通过直接操作编码来完成。

我的问题是为什么?他们为什么这样做?

我只有一个想法:防止在运行时进行复杂的类型检查。您需要查找层次结构并检查是否有具有 List 接口(interface)的父级。这需要时间,只有编译器有。 JVM 没有。

我说得对吗?

谢谢。

最佳答案

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

public void doSomething(List util) {}

public void doSomething(ArrayList util) {}

并考虑代码:

doSomething(getList());

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

关于jvm - Java:为什么.class文件中的方法类型包含返回类型,而不仅仅是签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1241810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com