我需要在运行时分析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
。但是没有找到这样的东西。
答案 0 :(得分:1)
所以,我试着对Javassist 中的方法进行细粒度分析,我发现真的,非常难,如果不是不可能的话。
无论如何,在我的时候,我找到了this,一个Java项目,结构良好的Javassist分析器。如果你按照github上有趣的包的链接。首先仔细查看课程ControlFlow.java
,然后再访问“Analyzer.java”#39;。在这里,您可以找到使用Javassist完成的一些很酷的东西。
当我在你的位置时,我努力解决我的问题,但我倾向于Javassist不是为字节码的超细粒度分析构建的事实,所以我挖了更多,我发现还有另一个库更适合此任务: ASM 。如果您有兴趣,可以在website上找到一些关于它的教程。
注意:使用此工具可以通过分支或甚至逐行分析您的类分支。