簡體   English   中英

如何使用ASM框架訪問匿名內部類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM