如何将变量传递给扩展 class 的方法
How to pass a variable to a method of an extended class
我正在扩展 class ClassVisitor
并覆盖方法 visitMethod
。然后我扩展 MethodVisitor
并覆盖 visitMethodInsn
。当我覆盖 visitMethod
时,我创建了扩展 MethodVisitor
.
的新实例
请看下面的代码了解一下。请记住,为了正确理解它,需要了解 ASM 库。
GraphClass.java:
public class GraphClass extends ClassVisitor {
public GraphClass() {
super(ASM5);
}
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
System.out.println("testing " + name + desc);
GraphMethod newVisitor = new GraphMethod();
return newVisitor;
}
}
GraphMethod.java:
public class GraphMethod extends MethodVisitor{
public GraphMethod() {
super(ASM5);
}
public void visitMethodInsn(int opcode, java.lang.String owner, java.lang.String name, java.lang.String descriptor, boolean isInterface) {
System.out.println(owner + name);
}
}
我想做的是将 visitMethod
中的 name
变量与 visitMethodInsn
中的其他变量一起打印。
我是 Java 的新手,所以任何提示都会很有帮助。
根据评论,我假设您想知道访问的方法调用了哪些方法 class,好吗?
使用 objectweb asm 的 tree-api 很容易解决。
ClassReader cr = new ClassReader(bytesOfSomeClass);
//Used class node instead of visiter
ClasaNode cn = new ClassNode(<asm version>);
cr.accept(cn, 0);
//Iterate all methods of class
cn.methods.forEach( (MethodNode mn) -> {
String callerName = mn.name;
//Iterate all instructions of current method
Stream.iterate(mn.instructions.getFirst(), AbstractInsnNode::getNext).limit(instructions.size())
.filter(node -> node instanceof MethodInsnNode) //take only method calls
.forEach(node -> {
String calledName = ((MethodInsnNode) node).name;
//Print results
System.out.println(calledName + " is called by " + callerName);
});
});
我正在扩展 class ClassVisitor
并覆盖方法 visitMethod
。然后我扩展 MethodVisitor
并覆盖 visitMethodInsn
。当我覆盖 visitMethod
时,我创建了扩展 MethodVisitor
.
请看下面的代码了解一下。请记住,为了正确理解它,需要了解 ASM 库。
GraphClass.java:
public class GraphClass extends ClassVisitor {
public GraphClass() {
super(ASM5);
}
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
System.out.println("testing " + name + desc);
GraphMethod newVisitor = new GraphMethod();
return newVisitor;
}
}
GraphMethod.java:
public class GraphMethod extends MethodVisitor{
public GraphMethod() {
super(ASM5);
}
public void visitMethodInsn(int opcode, java.lang.String owner, java.lang.String name, java.lang.String descriptor, boolean isInterface) {
System.out.println(owner + name);
}
}
我想做的是将 visitMethod
中的 name
变量与 visitMethodInsn
中的其他变量一起打印。
我是 Java 的新手,所以任何提示都会很有帮助。
根据评论,我假设您想知道访问的方法调用了哪些方法 class,好吗?
使用 objectweb asm 的 tree-api 很容易解决。
ClassReader cr = new ClassReader(bytesOfSomeClass);
//Used class node instead of visiter
ClasaNode cn = new ClassNode(<asm version>);
cr.accept(cn, 0);
//Iterate all methods of class
cn.methods.forEach( (MethodNode mn) -> {
String callerName = mn.name;
//Iterate all instructions of current method
Stream.iterate(mn.instructions.getFirst(), AbstractInsnNode::getNext).limit(instructions.size())
.filter(node -> node instanceof MethodInsnNode) //take only method calls
.forEach(node -> {
String calledName = ((MethodInsnNode) node).name;
//Print results
System.out.println(calledName + " is called by " + callerName);
});
});