[英]How to access the anonymous inner class using ASM framework
例如,我需要在編譯代碼后訪問run()中的信息。
Class A{
public static void main(String[] args){
new Thread(new Runnable() {
@Override
public void run() {
//something
}
}).start();
}
}
我已經擴展了ASM ClassVisitor,我應該怎么做才能訪問匿名內部類中的信息。
public class MyClassVisitor extends ClassVisitor {
public MyClassVisitor(final ClassVisitor cv) {
super(Opcodes.ASM5, cv);
}
@Override
public void visit(int version, int access, String name, String signature,
String superName, String[] interfaces) {
if (cv != null) {
cv.visit(version, access, name, signature, superName, interfaces);
}
}
@Override
public void visitInnerClass(String name, String outerName, String innerName, int access) {
//how should I do to access the information in an anonymous inner class
super.visitInnerClass(name, outerName, innerName, access);
}
}
您知道編譯后的匿名內部類的名稱類似於Main$1
。 基於這一事實,我們可以通過重寫visitMethod
來訪問方法信息。
代碼如下。
public class MyClassVisitor extends ClassVisitor {
private String ownerClassName;
public MyClassVisitor(final ClassVisitor cv) {
super(Opcodes.ASM5, cv);
}
@Override
public void visit(int version, int access, String name, String signature,
String superName, String[] interfaces) {
if (cv != null) {
cv.visit(version, access, name, signature, superName, interfaces);
ownerClassName = name;
}
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc,
String signature, String[] exceptions) {
MethodVisitor mv = cv.visitMethod(access, name, desc, signature,
exceptions);
//the name of anonymous inner class after compiled was like this: Main$1
String[] array = ownerClassName.split("$");
boolean isNumber = false;
if(array.length > 1){
isNumber = array[array.length - 1].matches("[0-9]+");
}
//if it's an anonymous inner class and the method was not construction method
if(isNumber && !name.equals("<init>")){
//return my custom MethodVisitor to parse the method information
return new MyMethodVisitor(mv);
}
return mv;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.