【发布时间】: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