0

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

4

2 回答 2

2

您可以使用BCELASM等字节码工程库创建一个。 依赖查找器将有关类的信息转储到 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);
    }
}

该库可以帮助将描述符字符串解析为参数。

于 2013-09-18T09:40:50.530 回答
1

试试 javassist http://www.csg.ci.iu-tokyo.ac.jp/~chiba/javassist/tutorial/tutorial.html 使用示例:

    ClassPool cp = ClassPool.getDefault();
    InputStream ins = new FileInputStream("Test.class");
    CtClass cc = cp.makeClass(ins);
    CtField[] fields = cc.getDeclaredFields();
    ...

这样我们在不加载类的情况下获得类描述

于 2013-09-18T10:18:40.020 回答