获取描述不加载类,我想要一些可以读取'.class'文件的库并返回一些对象,它保存方法名和字符串参数。一些可以作为Intellij Idea工作的库,当它不加载源时,它只是列出具有完整路径参数的公共方法。这种工具是免费提供的吗?
答案 0 :(得分:2)
您可以使用BCEL或ASM等字节码工程库创建一个。 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();
...
这样我们就可以在不加载类的情况下获得类描述