如何使用 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 分支。