планируется инструктировать методы в Java-классе с помощью Java asm,
{
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 ###### ");
}
}
вызывается только конструктор в PrintMessageMethodVisitor из MethodVisitor. Никакой другой метод, такой как 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, я, должно быть, пропустил тривиальный кусок, но не могу понять это.
Есть подсказка? пожалуйста помоги. Спасибо