关于java Runtime自编的公共API兼容性

时间:2011-09-22 03:29:04

标签: java bytecode binary-compatibility

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

有4个简单的类,Child类扩展Parent。 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());
}
}

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

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

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

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

我之前不知道这个,我想知道是否有人知道更多关于这个话题,例如,如果公共API添加一个throw,或添加一个同步或类成为final,等等。在这些情况下,他将如何呢。

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

感谢。

1 个答案:

答案 0 :(得分:2)

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

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

这些规则起初并不总是易于理解,但通常在您收到错误并考虑它们时才有意义。最好的办法是尝试你列出的个案,当你在JLS中得到一个不兼容的错误确认,然后尝试合理化为什么会这样。

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