我正在尝试(没有成功)仅打印给定方法的内容 . 以下代码几乎可以解决问题:
class MyTraceMethodVisitor extends MethodVisitor {
public MyTraceMethodVisitor(MethodVisitor mv) {
super(Opcodes.ASM4, mv);
}
@Override
public void visitMaxs(int maxStack, int maxLocals) {
}
}
class MyClassVisitor extends ClassVisitor {
public MyClassVisitor(ClassVisitor cv) {
super(Opcodes.ASM4, cv);
}
@Override
public FieldVisitor visitField(int access, String name, String desc,
String signature, Object value) {
return null;
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc,
String signature, String[] exceptions) {
if (name.equals("get777"))
return new MyTraceMethodVisitor(super.visitMethod(access, name, desc, signature, exceptions));
return null;
}
}
运行它
ClassReader classReader = new ClassReader("something.Point");
PrintWriter printWriter = new PrintWriter(System.out);
TraceClassVisitor traceClassVisitor = new TraceClassVisitor(printWriter);
MyClassVisitor myClassVisitor = new MyClassVisitor(traceClassVisitor);
classReader.accept(myClassVisitor, ClassReader.SKIP_DEBUG);
导致
// class version 50.0 (50)
// access flags 0x21
public class something/Point {
// access flags 0x1
public get777()I
SIPUSH 777
IRETURN
}
我想得到的只是
SIPUSH 777
IRETURN
没有签名,评论和任何 . 我怎么能做到这一点?
4 回答
答案已经很老了,需要编写很多代码 .
截至asm v5打印方法说明很简单:
在您的ClassVisitor实现中,只需覆盖visitMethod方法即可 . 这是一个例子:
TraceMethodVisitor将通过classVisitor接收访问方法指令等的事件调用 . 然后,TraceMethodVisitor将在打印机的帮助下打印代码 .
这似乎可以解决问题..虽然我不明白如何:
并且可以使用以下命令运行它:
在ASM 4中,有一个名为Printer的新抽象 . 您可以在TraceClassVisitor的构造函数中传递您自己的Printer实例(例如,扩展或复制Textifier实现) .
我能想到的最简单的事情是使用正则表达式或其他类型的字符串匹配来过滤掉指令 .
例如,使用
OutputStreamWriter
来写入String
. 保持all ASM opcode types的字符串值数组,然后如果String
中的一行包含操作码字符串,则该行是一条指令 .