获取描述而不是加载类,我想要一些可以读取“.class”文件并返回一些对象的库,该对象包含方法名称和字符串参数。一些在不加载源时可以作为 Intellij Idea 工作的库,它只是列出了带有完整路径参数的公共方法。这种工具是免费的吗?
问问题
1057 次
2 回答
2
您可以使用BCEL或ASM等字节码工程库创建一个。 依赖查找器将有关类的信息转储到 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 回答