【发布时间】:2019-07-23 10:00:58
【问题描述】:
我在一些 kotlin 代码中有一些抽象项目(我们称之为项目)字节码(它是每个类),每个类字节码都存储为 ByteArray;任务是告诉每个类中的哪些特定方法正在从项目的构建到构建进行修改。也就是说,The Project 的同一个类有两个 ByteArray,但它们属于不同的版本,我需要准确比较它们。一个简单的例子。假设我们有一个普通的类:
class Rst {
fun getjson(): String {
abc("""ss""");
return "jsonValid"
}
public fun abc(s: String) {
println(s)
}
}
它的字节码存储在 oldByteCode 中。现在类发生了一些变化:
class Rst {
fun getjson(): String {
abc("""ss""");
return "someOtherValue"
}
public fun newMethod(s: String) {
println("it's not abc anymore!")
}
}
它的字节码存储在 newByteCode 中。 这是主要目标:将 oldByteCode 与 newByteCode 进行比较。
这里我们有以下变化:
- getjson() 方法已更改;
- abc() 方法已被删除;
- newMethod() 已创建。
因此,如果方法的签名保持不变,则方法会更改。如果不是,那已经是另一种方法了。
现在回到实际问题。我必须通过它的字节码知道每个方法的确切状态。我现在拥有的是 jacoco 分析器,它将类字节码解析为“包”。在这些包中,我有包、类、方法的层次结构,但只有它们的签名,所以我无法判断方法的主体是否有任何变化。我只能跟踪签名差异。 是否有任何工具、库将类字节码拆分为其方法字节码?例如,我可以使用这些计算哈希并进行比较。也许 asm 库对此有任何处理? 欢迎任何想法。
【问题讨论】:
标签: java bytecode java-bytecode-asm