将给定类(例如,java.lang.Object)转换为字节数组。可能吗?

时间:2011-11-02 12:15:32

标签: java reflection classloader

鉴于类加载器接受将给定类的字节数组作为输入,返回Class<?>,我想知道是否可以执行相反的操作,即传递Class<?>并获取其字节数组?

请记住,我不是在谈论序列化!

4 个答案:

答案 0 :(得分:2)

我不知道标准方式。但是你可以实现自己的委托类加载器,跟踪按名称和字节码加载的类。

你的用例是什么? - 将代码传输到远程应用程序?

答案 1 :(得分:2)

您可以使用ClassLoader.getResourceAsInputStream(),但不保证这将与加载的字节数相同。我不相信加载的实际字节存储在任何地方。

答案 2 :(得分:2)

ClassLoader实现必须为它支持的Java语言规范版本提供类的表示。因此,它必须包含获取字节数组并将其转换为Class对象的逻辑,或者扩展一些具有此功能的ClassLoader。但是,Java定义的抽象ClassLoader类没有任何可以从Class返回byte []的方法。有些实现可能有这个(可能是引导程序,系统或其他类加载器),但这本身就是特定于实现的,而不是依赖它。

如果您需要这种功能,一种方法是创建自己的ClassLoader实现并覆盖defineClass方法,使输入字节数组映射到{ {1}}对象,以便以后可以检索它们。

由于编译器将源代码转换为类文件(基本上是byte [])并且类加载器将类文件转换为Class个对象,因此链中没有任何东西直接适合从Class转移到一个字节[]。但是有了那些做字节代码编织,运行时字节代码生成等的东西,你可能会发现可以做到这一点。

答案 3 :(得分:2)

以下是BCEL尝试的内容:

JavaClass clazz = Repository.lookupClass("foo.bar.YourClass");
byte[] bytes = clazz.getBytes();

在阅读您的问题之前我不知道答案,但我知道我应该检查以下库,因为它们支持Java class file format

  • BCEL
  • 了Javassist
  • ASM

如果上述方法不起作用,请在这些库中查找其他内容。