将给定类(例如,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
如果上述方法无效,请在这些库中查找其他内容。