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

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

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

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

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

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

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

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

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

这是BCEL的尝试:

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

在阅读你的问题之前我不知道答案,但我知道我应该检查以下库,因为它们支持Java类文件格式 :

  • BCEL
  • 了Javassist
  • ASM

如果上述方法无效,请在这些库中查找其他内容。