使用ASM访问每个指令(字节码)

时间:2017-09-14 13:20:27

标签: java bytecode instrumentation java-bytecode-asm

我有一个依赖于BCEL库的工作分析器,但由于JDK1.7或更高版本不再支持后者,我试图使用ASM库进行复制。有没有办法使用MethodVisitor类访问方法的每个指令? 我找到了使用ClassNode,MethodNode和InsnList的方法,但我很想知道它是否可以使用Visitor框架实现。以下代码显示了我想要做的事情

// main function
InputStream in = new FileInputStream("path_to_classfile.class");
ClassReader reader = new ClassReader(in);
ClassNode classNode = new ClassNode();
reader.accept(classNode,0);

List<MethodNode> methods = classNode.methods;
for(MethodNode m: methods){
    System.out.println("Method name: " + m.name);
    InsnList m_instructionList= m.instructions;
    for (int m_i = 0; m_i < m_instructionList.size(); m_i++){
       AbstractInsnNode instruction = m_instructionList.get(m_i);
       if(instruction.getOpcode() == Opcodes.ISTORE){
            // insert bytecode to call a profiler method
        }else if(instruction.getOpcode() == Opcodes.FSTORE){
            // insert call to a a profiler method
        }
        else if...
    }
}
// Write to a .class file

谢谢!

0 个答案:

没有答案