鉴于类加载器接受将给定类的字节数组作为输入,返回Class<?>
,我想知道是否可以执行相反的操作,即传递Class<?>
并获取其字节数组?
请记住,我不是在谈论序列化!
答案 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:
如果上述方法不起作用,请在这些库中查找其他内容。