gpt4 book ai didi

java - 如何使用ASM访问内部类的方法?

转载 作者:行者123 更新时间:2023-11-30 01:56:32 30 4
gpt4 key购买 nike

我正在尝试打印 .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 中添加,因此必须将它们修改为现有的类文件格式。因此,在字节码级别,嵌套类只是单独类文件中的普通类。它们唯一的区别是几个元数据属性,这些属性保存有关源级别嵌套类的信息,以用于反射和编译。

因此,访问嵌套类的方法是像任何其他类一样加载并处理它。您已经弄清楚如何获取嵌套类的名称,现在您只需创建一个新的 ClassFileReader 并递归地加载每个类。

关于java - 如何使用ASM访问内部类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54300444/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com