从字节码解析类名

是否有可能从类源代码中形成的字节码中挖掘出一个类名?

情况是这样的:我从某个地方远程获取一个类字节码,它来自哪里无关紧要。 要使用类加载器有效地加载该类,我需要具有类名…对吗?

最简单的方法可能是使用像ASM这样的东西:

 import org.objectweb.asm.ClassReader; import org.objectweb.asm.commons.EmptyVisitor; public class PrintClassName { public static void main(String[] args) throws IOException { class ClassNamePrinter extends EmptyVisitor { @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { System.out.println("Class name: " + name); } } InputStream binary = new FileInputStream(args[0]); try { ClassReader reader = new ClassReader(binary); reader.accept(new ClassNamePrinter(), 0); } finally { binary.close(); } } } 

如果您不能使用第三方库,您可以自己阅读类文件格式 。

您应该能够使用javap来反汇编字节代码,如果这只是偶尔发生一次。

在运行时这样做:使用像Apache的BCEL( http://jakarta.apache.org/bcel )这样的字节码操作库来分析字节码。

我认为您可以在ClassLoader的子类中使用ClassLoader.defineClass方法来获取给定字节码的Class对象。 (未测试)

为了完整起见,在可以使用ASM5库的情况下,可以使用以下调用从其字节表示中获取类名。

 public String readClassName(final byte[] typeAsByte) { return new ClassReader(typeAsByte).getClassName().replace("/", "."); }