簡體   English   中英

如何使用ASM訪問內部類的方法?

[英]How to access methods of inner classes using ASM?

我正在嘗試在.class文件中打印出所有方法的說明。 下面的代碼僅打印出外部類的方法( main )的指令。

如何訪問內部類的方法? 我讀到可以像加載外部類一樣加載內部類。 我怎樣才能做到這一點?

import java.io.InputStream;
import java.io.FileInputStream;
import java.io.StringWriter;
import java.io.PrintWriter;
import java.util.List;
import org.objectweb.asm.*;
import org.objectweb.asm.tree.*;
import org.objectweb.asm.util.*;

public class ClassInfoReader {

    public static void main(String[] args) throws Exception{
        InputStream in = new FileInputStream("MyInfo.class");
        ClassReader reader = new ClassReader(in);
        ClassNode classNode = new ClassNode();
        reader.accept(classNode,0);
        @SuppressWarnings("unchecked")
        final List<MethodNode> methods = classNode.methods;
        for(MethodNode m: methods){
             InsnList inList = m.instructions;
             System.out.println(m.name);
             for(int i = 0; i< inList.size(); i++){
                 System.out.print(insnToString(inList.get(i)));
             }
        }

        final List<InnerClassNode> classes = classNode.innerClasses;
        System.out.println(classes);
        for(InnerClassNode c: classes){
             System.out.println(c.innerName);
        }
    }

    public static String insnToString(AbstractInsnNode insn){
        insn.accept(mp);
        StringWriter sw = new StringWriter();
        printer.print(new PrintWriter(sw));
        printer.getText().clear();
        return sw.toString();
    }

    private static Printer printer = new Textifier();
    private static TraceMethodVisitor mp = new TraceMethodVisitor(printer);

該部分代碼僅顯示有關內部類的基本信息,例如內部類的名稱,外部類的名稱和訪問標志。

final List<InnerClassNode> classes = classNode.innerClasses;
        for(InnerClassNode c: classes){
             System.out.println(c.innerName);
        } 

嵌套類不是原始Java的一部分。 它們僅是在Java 1.1中添加的,因此必須將其改裝為現有的classfile格式。 因此,在字節碼級別,嵌套類只是單獨的類文件中的普通類。 區別它們的唯一方法是幾個元數據屬性,這些屬性保存有關源級別嵌套類的信息,以進行反射和編譯。

因此,訪問嵌套類的方法是加載它並像處理其他任何類一樣對其進行處理。 您已經弄清楚了如何獲取嵌套類的名稱,現在只需要創建一個新的ClassFileReader並遞歸地加載它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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