有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何从字节码中获取类描述?

获取描述不加载类,我想要一些可以阅读的库。类的文件并返回一些对象,这些对象包含该文件的方法名和字符串参数。一些可以像Intellij Idea一样工作的库,当它不加载源代码时,它只是列出带有完整路径参数的公共方法。这种工具是免费的吗


共 (2) 个答案

  1. # 1 楼答案

    您可以使用字节码工程库(如BCELASM)创建一个Dependency finder将有关类的信息转储到xml中。它几乎拥有你想要的所有信息。您可以从它的源代码开始

    样品

    import org.objectweb.asm.ClassReader;
    import org.objectweb.asm.ClassVisitor;
    import org.objectweb.asm.MethodVisitor;
    import org.objectweb.asm.Opcodes;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Arrays;
    
    
    public class DemoClassReader {
        public static void main(String[] args) throws IOException {
            ClassVisitor v= new ClassVisitor(Opcodes.ASM4) {
    
                @Override
                public void visit(int version, int access, String name,
                                  String signature, String superName, String[] interfaces) {
                    System.out.println(" class: "+name);
                    System.out.println("parent  class: "+superName);
                    super.visit(version, access, name, signature, superName, interfaces);
                }
    
                @Override
                public MethodVisitor visitMethod(int i, String method, String desc, String signature, String[] strings) {
                    System.out.println("method name/block= " + method);
                    System.out.println("descriptor   = " + desc);
                    System.out.println("signature  = " + signature);
                    System.out.println("declared exceptions=" + Arrays.toString(strings));
                    return super.visitMethod(i, method, desc, signature, strings);    
                }
            } ;
    
            InputStream in=String.class.getResourceAsStream("/java/lang/String.class");
            ClassReader classReader=new ClassReader(in);
            classReader.accept(v, 0);
        }
    }
    

    This library有助于将描述符字符串解析为参数