代码之家  ›  专栏  ›  技术社区  ›  Brian Harris

将类对象转换为字节

  •  24
  • Brian Harris  · 技术社区  · 15 年前

    如果我有 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文件加载类;例如,它可以处理网络加载的类。用这种方法可以跳过几个圈,但我会记住的。谢谢大家!

    5 回复  |  直到 11 年前
        1
  •  23
  •   raffian Eric Reid    11 年前

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

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

    我可能会建议使用ApacheCommonsIO中的某些内容将输入流读取到 byte[] 但是 IOUtils.toByteArray() 应该有技巧。编写代码很容易出错和/或变慢。

        2
  •  2
  •   Tom Hawtin - tackline    15 年前

    一般来说,你不能那样回去。但是,对于某些类加载器,您可能能够获取资源文件,使用完全限定的类名,替换 . 具有 / 追加 .class (所以) mypackage.MyClass 变成 mypackage/MyClass.class (请记住,可能区分大小写)。

        3
  •  2
  •   Suraj Chandran    15 年前

    你可以试试Java instrumentation !特别地 ClassFileTransformer 也许你感兴趣!!

    您只需重写转换方法(从ClassFileTransformer),并且在加载每个类之前将调用转换方法。所以你可以做任何类字节。

        4
  •  1
  •   les2    15 年前

    有趣…

    将“.class”作为文件加载会产生您需要的输入吗?换句话说,我相信您需要一个使用javac或其他编译器编译的文件。

        5
  •  1
  •   stacker    15 年前