将Class对象转换为字节

时间:2010-01-10 04:42:17

标签: java classloader

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

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

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

5 个答案:

答案 0 :(得分:23)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

你可以试试java instrumentation!特别是你可能感兴趣的ClassFileTransformer !!

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

答案 3 :(得分:1)

有趣......

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

答案 4 :(得分:1)