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

时间:2013-09-18 09:32:06

标签: java class intellij-idea analytics bytecode

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

2 个答案:

答案 0 :(得分:2)

您可以使用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可以帮助将描述符字符串解析为参数..

答案 1 :(得分:1)

尝试javassist http://www.csg.ci.i.u-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();
    ...

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