将Class对象转换为字节

如果我在运行时有一个Class实例,我可以得到它的byte []表示吗? 我感兴趣的字节是Class文件格式 ,这样它们就是[ClassLoader.defineClass] [3]的有效输入。

[3]: http : //java.sun.com/j2se/1.5.0/docs/api/java/lang/ClassLoader.html#defineClass(java.lang.String ,byb [],int,int)

编辑:我接受了一个getResourceAsStream答案,因为它很简单,大部分时间都可以工作。 ClassFileTransformer似乎是一个更强大的解决方案,因为它不要求从.class文件加载类; 例如,它将处理网络加载的类。 用这种方法可以跳过几个箍,但我会记住。 谢谢大家!

您通常可以从类加载器中将类作为资源加载。

Class c = ... String className = c.getName(); String classAsPath = className.replace('.', '/') + ".class"; InputStream stream = c.getClassLoader().getResourceAsStream(classAsPath); 

我可能会建议使用Apache commons-io中的东西将InputStream读入byte[] ,但IOUtils.toByteArray()应该可以解决问题。 编写代码很容易出错和/或变慢。

一般来说,你不能这样回去。 但是,对于某些类加载器,您可以使资源文件获取完全限定的类名,替换. 使用/并附加.class (因此mypackage.MyClass变为mypackage/MyClass.class (记住,可能区分大小写))。

你可以尝试java 检测 ! 特别是ClassFileTransformer可能对你感兴趣!!

您只需覆盖transform方法(来自ClassFileTransformer),并在加载每个类之前调用​​transform方法。 那么你就可以做任何类字节。

有意思……

将“.class”加载为文件会产生您需要的输入吗? 换句话说,我相信你需要一个使用javac或其他编译器编译的文件。