【问题标题】:Java ASM MethodVisitor's methods are not called by ClassVisitorJava ASM MethodVisitor 的方法不被 ClassVisitor 调用
【发布时间】:2019-01-13 03:28:08
【问题描述】:

计划使用 Java asm 检测 java 类上的方法,

{

    ClassReader cr = new ClassReader(classfileBuffer);
    ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
    ClassVisitor cv = new LogMethodClassVisitor(cw, className);
    cr.accept(cv,  0);
    newClassByte = cw.toByteArray();

}

下面是 ClassVisitor 的派生类

public class LogMethodClassVisitor extends ClassVisitor {
    private String className;

    public LogMethodClassVisitor(ClassVisitor cv, String pClassName) {
        super(Opcodes.ASM4, cv);
        className = pClassName;
    }

    @Override
    public MethodVisitor visitMethod(int access, String name, String desc,
                                     String signature, String[] exceptions) {
        MethodVisitor mv = super.visitMethod(access, name, desc, signature,
                exceptions);

        if (name.equalsIgnoreCase("getParameter") && (mv != null)) {
            mv =  new PrintMessageMethodVisitor(mv, name, className);

        }

        return mv;
    }
}


public class PrintMessageMethodVisitor extends MethodVisitor {

    String name;
    String classname;

    public PrintMessageMethodVisitor (MethodVisitor mv, String name, String classname)

    {
        super(ASM5, mv);
        this.name = name;
        this.classname = classname;
    }


    @Override
    public void visitCode() {
        {
            System.out.println ("###### entering visitCode ###### ");
        }
    }

仅调用 MethodVisitor 中 PrintMessageMethodVisitor 中的构造函数。没有调用 visitCode 等其他方法。

我尝试了这个论坛的不同方法,例如,

1) use adviceadapter instead of methodVistor
2) cr.accept(cv,ClassReader.EXPAND_FRAMES) ;

他们都没有工作。

我打开了这些属性,

                    <Can-Redefine-Classes>true</Can-Redefine-Classes>
                    <Can-Retransform-Classes>true</Can-Retransform-Classes>
                    <Can-Set-Native-Method-Prefix>true</Can-Set-Native-Method-Prefix>

上面的代码是一个典型的 Java asm 插桩示例,我一定错过了一些琐碎的部分,但我无法弄清楚。

有什么线索吗?请帮忙。谢谢

【问题讨论】:

    标签: java java-bytecode-asm javaagents


    【解决方案1】:

    非常愚蠢的错误。该方法是一个没有任何代码的抽象函数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 2020-06-02
      • 2012-03-05
      • 1970-01-01
      相关资源
      最近更新 更多