【问题标题】:convert Class object to bytes将 Class 对象转换为字节
【发布时间】:2010-01-10 04:42:17
【问题描述】:

如果我在运行时有一个 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, 字节[], int, int)

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

【问题讨论】:

标签: java classloader


【解决方案1】:

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

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

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

【讨论】:

  • 当我收到ByteArrayInputStream这个消息时,如何在另一端编译类?
  • 从字节创建类是 ClassLoader 的工作。
  • 你好,如果该类是代理类,并且是在运行时动态生成的,并且存储在内存中,如何保存到文件中呢?
  • 反向操作怎么办?也就是把byte[]转成java.lang.Class?
【解决方案2】:

一般来说,你不能那样回去。但是,对于某些类加载器,您可能能够让资源文件采用完全限定的类名,将 . 替换为 / 并附加 .class(因此 mypackage.MyClass 变为 mypackage/MyClass.class(请记住,可能是区分大小写))。

【讨论】:

    【解决方案3】:

    你可以试试javainstrumentation!特别是ClassFileTransformer你可能感兴趣!!

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

    【讨论】:

      【解决方案4】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-19
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多