Asm字节码查询

时间:2011-04-16 20:41:49

标签: java bytecode instrumentation bytecode-manipulation java-bytecode-asm

嘿所有, 我正在尝试使用ASM字节码树Api为类进行静态分析。 我想我有一个非常基本的问题。在一个说foobar()的方法中,我在foobar中有一个指令列表(InsnList有一个List)。现在我想检查指令号10是否正在调用函数“barfoo(String args)”。

另外,我需要验证特定指令是否是有条件的。

谢谢和问候, SJ

注意:我已经可以阅读一个类并达到我感兴趣的特定方法,并遍历该方法的每个方法。

解决(见:格雷格的评论):

    AbstractInsnNode s = ...
    if(s.getType()==AbstractInsnNode.METHOD_INSN){
        MethodInsnNode methodInvocationNode = (MethodInsnNode) s;
        if(methodInvocationNode.name.equals("barfoo"))
        {
            return true;
        }
    }

2 个答案:

答案 0 :(得分:2)

通过查看ASM javadoc,看起来您必须在指令节点上调用getType(),如果类型为METHOD_INSN,则可以转换为MethodInsnNode 。从那里,查看.name以查看方法名称。

答案 1 :(得分:0)

简单 - 一旦您确定已调用foobar,就会在您访问的每条指令上开始递增计数器。在第十次调用时,请检查barfoo

的调用