如何使用javassist在java方法中查找if语句

时间:2017-04-04 11:52:35

标签: java 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。但是没有找到这样的东西。

1 个答案:

答案 0 :(得分:1)

所以,我试着对Javassist 中的方法进行细粒度分析,我发现真的,非常难,如果不是不可能的话。

无论如何,在我的时候,我找到了this,一个Java项目,结构良好的Javassist分析器。如果你按照github上有趣的包的链接。首先仔细查看课程ControlFlow.java,然后再访问“Analyzer.java”#39;。在这里,您可以找到使用Javassist完成的一些很酷的东西。

当我在你的位置时,我努力解决我的问题,但我倾向于Javassist不是为字节码的超细粒度分析构建的事实,所以我挖了更多,我发现还有另一个库更适合此任务: ASM 。如果您有兴趣,可以在website上找到一些关于它的教程。

注意:使用此工具可以通过分支或甚至逐行分析您的类分支。