java - 关于java Runtime自写公共(public)API兼容性

标签 java bytecode binary-compatibility

我刚刚遇到了一个关于更改 API 的实际问题。我想了解更多关于这个话题的信息。 使用以下示例作为演示。

有 4 个简单的类,Child 类扩展 Parent。 PubAPI是提供公共(public)方法供用户使用的类。客户端类调用 PubAPI 的公共(public)方法。

public class Parent
{
}

public class Child extends Parent
{
}


public class PubAPI
{
public Parent getChild(){
    return new Child();
}
}


public class Client
{
public static void main(String[] args)
{
    System.out.println(new PubAPI().getChild());
}
}

前3个类是由API制造商提供的,假设上面的版本是版本1。

在版本 2 中,PubAPI 类更改为返回子类型:

public class PubAPI
{
public Child getChild(){
    return new Child();
}
}

3 API 提供程序类现在处于版本 2 中,而如果我们不重新编译“Client”类并使用其版本 1 生成的类文件。 IT 将在 java 运行时失败,并出现错误找不到版本 1 方法(因为返回类型发生变化)。

我以前不知道这一点,我想知道是否有人对这个主题有更多了解,例如,公共(public) API 是否添加了一个 throw,或者添加了一个同步,或者该类变成了final,等等。在这些情况下,他会怎么样。

总而言之,其他人使用的 API 类的公共(public) API/类字节码级别兼容性规则是什么。

谢谢。

最佳答案

编辑:您两周前问了几乎完全相同的问题并接受了答案。我想知道是什么促使您再次询问,您认为规则不会在两周内发生变化,是吗?

使用关键字字节码级别兼容性,您的方向是正确的。它称为二进制兼容性,您可以在网上查找。例如,here

这些规则一开始并不总是容易理解,但当您遇到错误并思考它们时通常会有意义。最好的办法是尝试您列出的个别案例,当您在 JLS 中收到错误时,请确认这是不兼容的,然后尝试为自己合理解释为什么会这样。

This so 的问题似乎讨论了完全相同的问题。 document at eclipse它的网站比 JLS 更容易阅读。

关于java - 关于java Runtime自写公共(public)API兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7509244/

相关文章:

python - 具有任意局部变量的 exec() 字节码?

java - 检测 Scala 程序中函数变化的最佳实践?

ARMv8 向后兼容 ARMv7(Snapdragon 820 与 Cortex-A15)

c++ - C++ 中的全局数组会破坏二进制兼容性吗?

Java 类和静态 block

java - UnsatisfiedLinkError - 无法加载库 - 在资源路径中找不到 native 库

java - 我可以使用 Fitbit Api 获取我的 Fitbit 的加速度数据吗?

java - TOMCAT 9 +Java 8升级问题: The method URLDecode(String) is undefined for the type RequestUtil

java - 替换 ASM 中的 Class.forName 方法调用(内联)

c# - 每次制作 dll 时如何告诉 vb6 不要创建新版本的 interfaces/com 对象?