在方法签名/字段中查找不兼容性的工具

8

我希望能够比较两个版本的类/库,以确定是否有任何更改可能会破坏调用它的代码。例如,考虑某个类 Foo,在版本 a 中具有一个方法:

public String readWidget(Object widget, Object helper);

在版本b中,该方法变为:

public String readWidget(Object widget); //removed unnecessary helper object

或者在字段的情况下类似于这样:

version a: public static Object sharedFoo;
version b: static Object sharedFoo; //moved to package private for version b

我希望能有一个工具,可以将这些更改标记为潜在的不兼容性(但最好不要反向增加方法的可见性)。现在我知道我可以通过反射或分析javap的输出来实现这一点,但似乎应该存在一个现有的工具(最好是非商业性质的)。因此,在我犯下自己制作/不必要地重复造轮子之前,我想看看是否有人可以推荐一些工具。

3个回答

3

我可能没有理解问题,但编译器难道不是解决这个问题的确切工具吗?

重新编译使用Foo的类以适应Foo的新版本,如果存在任何不兼容性,将很快显现出来。


1
您的陈述是正确的,但是这些类需要提供给外部资源使用,因此如果发生错误,它们的编译器将会报错,而我不希望这对他们来说是一个意外。我的想法是不破坏它们的兼容性,基本上确保在破坏兼容性之前有足够的时间使事物过时。换句话说,在到达编译器错误点之前,我希望进行预防性分析。 - M. Jessup

2
这里是你不想听到的答案,但我认为这是一个有效的答案:
1.编写一套单元测试,调用 API 的每个方法(你已经有这个了,对吧?:-))。 2.当您进行 API 更改时,重新编译 API 的新版本,但不重新编译单元测试。 3.使用“陈旧”的单元测试集针对“新鲜”的 API 进行运行。这些陈旧的测试集成为金丝雀,模仿 API 的客户所处的情况。
重新编译所有客户端代码的第一个问题是可能不可能。代码可能不属于您;它可能是您的某个客户编写的定制代码,而且不可用于您。
重新编译客户端代码的第二个问题是,有时您甚至不会收到编译错误,因为调用代码不需要更改。我曾经遇到过这样的问题。我有一个像这样的 API 方法:
public void doSomething(){
}

使用与其链接的代码。我想将其更改为:

public boolean doSomething() {
}

于是我这样做并重新编译。没有错误,因为调用第一个版本的doSomething()代码自动链接到新版本(Java中的返回值是有效的被忽略)。但我不知道的是,当我重新编译时,它确实改变了外部类的字节码。结果我们开始出现错误,即更新API但未对使用它的代码重新编译。

因此,除了查找错误,我还应该查看哪些外部文件其字节码发生了更改。这时候,我建议你为此目的使用单元测试,因为你本来就应该编写它们。


2
翻译:Guava 使用 JDiff 来报告 版本更改,也许你也会发现它很有用吗?

我不确定这是否完全符合我的要求,但它非常接近。我也一直在研究japitools。 - M. Jessup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接