有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将类对象转换为字节

如果我在运行时有一个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似乎是一个更健壮的解决方案,因为它不需要从中加载类。类文件;例如,它将处理网络加载的类。这种方法有一些困难需要克服,但我会记住的。谢谢大家


共 (4) 个答案

  1. # 1 楼答案

    通常,您可以将类作为资源从类加载器中加载

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

    我可能会建议使用ApacheCommons io中的一些东西将InputStream读入byte[],但是IOUtils.toByteArray()应该可以做到这一点。编写代码很容易出错和/或变得缓慢

  2. # 2 楼答案

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

    只需重写transform方法(来自ClassFileTransformer),在加载每个类之前就会调用transform方法。那么你可以做任何类字节

  3. # 3 楼答案

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