【问题标题】:About java Runtime self-written public API compatibility关于java Runtime自写公共API兼容性
【发布时间】:2023-04-07 09:56:01
【问题描述】:

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

有 4 个简单的类,子类扩展了父类。 PubAPI 是提供公共方法以供使用的类。客户端类调用 PubAPI 的公共方法。

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 版中,而如果我们不重新编译“客户端”类并使用其第 1 版生成的类文件。 IT 将在 java 运行时失败,并出现错误找不到版本 1 方法(因为返回类型更改)。

我以前不知道,我想知道是否有人对此主题有更多了解,例如,公共 API 是否添加了 throw,或添加了 synchronize 或类变为 final 等。在这些情况下,他会怎么样。

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

谢谢。

【问题讨论】:

标签: java bytecode binary-compatibility


【解决方案1】:

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

使用关键字字节码级别兼容性,您走在了正确的轨道上。它被称为二进制兼容性,您可以在网上查找。比如here

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

This 这样的问题似乎讨论了完全相同的问题。 document at eclipseit 站点比 JLS 更容易阅读。

【讨论】:

    猜你喜欢
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多