如何静态地在JAR中识别缺失的方法(二进制兼容性)

Era*_*dan 18 java static-analysis bytecode jar binary-compatibility

我想验证2个JAR之间的二进制兼容性.

根据这个答案中的建议,我使用jboss tattletale,但它只能找到缺少的类.

如何找到缺少的方法?有可能吗?

例如

"取决于 - " Foo 课程取决于Bar(像许多其他中产阶级工人一样)

import org.overlyusedclassnames.Bar

public class Foo{
    public void someMethod(){
         Bar tender = new Bar();
         tender.getJohnnyRedLabel();
         tender.getJohnnyBlueLabel(); //this method is new in the Bar class
    }
}
Run Code Online (Sandbox Code Playgroud)

"编译时间"课程

package org.overlyusedclassnames;

/** 
 * @Since 1992
 * Changes: added blue and gold Johnny Walker labels
 */

public class Bar {
    public Drink getJohnnyRedLabel(){
         return new JohnyWalkerFactory.get(RedLabel.class);
    }

    public Drink getJohnnyBlackLabel(){
         return new JohnyWalkerFactory.get(BlackLabel.class);
    }

    public Drink getJohnnyGoldLabel(){
         return new JohnyWalkerFactory.get(GoldLabel.class);
    }

    public Drink getJohnnyBlueLabel(){
         return new JohnyWalkerFactory.get(BlueLabel.class);
    }

}
Run Code Online (Sandbox Code Playgroud)

现在假设一个旧的 Bar jar正在替换编译的时间栏:

"运行时间"类

package org.overlyusedclassnames;

/** 
 * @Since 1909
 * Changes: added red and black Johnny Walker labels
 */

public class Bar {
    public Drink getJohnnyRedLabel(){
         return new JohnyWalkerFactory.get(RedLabel.class);
    }

    public Drink getJohnnyBlackLabel(){
         return new JohnyWalkerFactory.get(BlackLabel.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法识别丢失的方法而不运行它并得到一个NoSuchMethodError


免责声明:这是对我自己的相关问题的一个重要修改,这是不可取消的.我之所以选择提出一个新问题是因为改述将使当前的2个答案与主题完全无关.

lin*_*ild 16

japi-compliance-checker - Java库的后向API/ABI兼容性检查器:

japi-compliance-checker -lib NAME -old OLD.jar -new NEW.jar
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

sigtest - Oracle的SigTest签名测试和API一致性工具

japitools - 测试Java API之间的兼容性

japi-checker - 一个在二进制级别工作的java API向后兼容性检查器

revapi - API分析和变更跟踪工具

或手动使用javap反编译器:

javap OLD.class > OLD.txt
javap NEW.class > NEW.txt
diff -rNau OLD.txt NEW.txt > CHANGES.txt