gpt4 book ai didi

java - 在执行遗留代码的 java jvm 中发生了什么,该代码因语言更改而失效

转载 作者:搜寻专家 更新时间:2023-11-01 02:18:39 26 4
gpt4 key购买 nike

假设您有遗留的 Java 代码,它不能被最新版本的 Java 编译。例如

public class ProviderUnavailableException extends Exception {

private int cause;

public int getCause(){
return cause;
}
// rest of implementation
}

在 Java 1.3 时代,这段代码是有效的。

在 Java 1.4 中,Throwable 类“重新定义”了方法 getCause()。它看起来像这样:

public Throwable getCause()

现在遗留代码无效(因为“int”不是“Throwable”的子类型)但不会导致运行时问题。或者在某些情况下会发生这种情况吗?

回到编译时,编译器已经生成了字节码来仅在该类中处理方法 getCause 的执行,因此“知道”不必调用父类(super class),这是否正确?

编辑

我用“javap -c”检查了遗留代码的字节码。

  public int getCause();
Code:
0: aload_0
1: getfield #2; //Field _cause:I
4: ireturn

所以它返回本地字段。对我来说似乎没问题。

最佳答案

在字节码中,方法由其名称、参数类型和返回类型引用。所以这两种方法是完全不同的。

在字节码符号中,您的 1.3 方法将是(我认为):

getCause()J

虽然新的 1.4 方法是:

getCause()Ljava/lang/Throwable;

您可以使用 javap -s 查看签名。

协变返回类型实际上是由 javac 使用合成桥方法在编译时实现的。他们没有运行时支持。因此,如果您使用 String run() 重写 Object run(),javac 将在派生类中创建这两个方法,其中 Object run() 调用 String run().

关于java - 在执行遗留代码的 java jvm 中发生了什么,该代码因语言更改而失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/756061/

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