如何静态识别 JAR 中缺少的方法(二进制兼容性)
2022-09-02 12:56:00
我想验证 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
}
}
“编译时”类
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);
}
}
现在想象一下,一个旧的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);
}
}
有没有办法识别缺少的方法,而无需运行它并获取?NoSuchMethodError
免责声明:这是我自己的相关问题的重大改写,这是不可删除的。我选择问一个新问题,因为改写会使当前的2个答案与主题完全无关。