如何使用 javassist 在 java 方法中查找 if 语句
How to find if statements in java method using javassist
我需要在运行时分析一个 java 方法体。 javassist 提供了很多方法帮助我做到这一点。但是现在我需要知道给定的方法是否包含 if 语句或循环。我怎样才能做到这一点?
大多数问题可以使用
来回答
method.instrument(new ExprEditor() {
@Override
public void edit(MethodCall m) {
// do some checks
}
});
但是没有分支或循环的编辑方法。
到目前为止我尝试了什么:
for (CodeIterator ci = method.getMethodInfo().getCodeAttribute().iterator(); ci.hasNext();) {
int op = ci.next();
System.out.println(Mnemonic.OPCODE[op]);
}
希望找到一些 if_*
或 goto
。但是没有找到这样的东西。
所以,我尝试自己对 Javassist 中的方法进行 细粒度分析,我发现那是 真的,真的很难 如果不是不可能的话。
无论如何,我当时发现 this,Java 中的一个项目,具有结构良好的 Javassist 分析器。如果您跟随 link 到 github 上有趣的包。首先仔细查看 classes ControlFlow.java
,然后再查看 'Analyzer.java'。在这里您可以找到使用 Javassist 完成的一些很酷的东西。
当我处于你的位置时,我努力解决我的问题,但我屈服于 Javassist 不是为字节码的超细粒度分析而构建的事实,所以我挖掘了更多和我发现还有一个库更适合这个任务:ASM。如果您有兴趣,可以在其 website 上找到一些相关教程。
注意:使用此工具可以逐个分支甚至逐行分析您的 class 分支。
我需要在运行时分析一个 java 方法体。 javassist 提供了很多方法帮助我做到这一点。但是现在我需要知道给定的方法是否包含 if 语句或循环。我怎样才能做到这一点?
大多数问题可以使用
来回答method.instrument(new ExprEditor() {
@Override
public void edit(MethodCall m) {
// do some checks
}
});
但是没有分支或循环的编辑方法。 到目前为止我尝试了什么:
for (CodeIterator ci = method.getMethodInfo().getCodeAttribute().iterator(); ci.hasNext();) {
int op = ci.next();
System.out.println(Mnemonic.OPCODE[op]);
}
希望找到一些 if_*
或 goto
。但是没有找到这样的东西。
所以,我尝试自己对 Javassist 中的方法进行 细粒度分析,我发现那是 真的,真的很难 如果不是不可能的话。
无论如何,我当时发现 this,Java 中的一个项目,具有结构良好的 Javassist 分析器。如果您跟随 link 到 github 上有趣的包。首先仔细查看 classes ControlFlow.java
,然后再查看 'Analyzer.java'。在这里您可以找到使用 Javassist 完成的一些很酷的东西。
当我处于你的位置时,我努力解决我的问题,但我屈服于 Javassist 不是为字节码的超细粒度分析而构建的事实,所以我挖掘了更多和我发现还有一个库更适合这个任务:ASM。如果您有兴趣,可以在其 website 上找到一些相关教程。
注意:使用此工具可以逐个分支甚至逐行分析您的 class 分支。