代码之家  ›  专栏  ›  技术社区  ›  jennykwan

Java:在运行时从同一个JVM中获取类的字节码

  •  11
  • jennykwan  · 技术社区  · 15 年前

    相关: Is there a way to obtain the bytecode for a class at runtime?

    如果我搞错了,请更正我,但是使用代理需要生成一个单独的VM,该代理连接到第一个VM。我需要在同一个虚拟机上做。

    仅使用可序列化来设置和获取类对象是不够的。在反序列化时,我需要加载该类,在随后的VM实例中,可能存在类名冲突。我需要修改字节码,以便在反序列化/类加载时将类重命名为唯一的类。

    3 回复  |  直到 8 年前
        1
  •  5
  •   Keith Randall    15 年前

    你可以自己写 ClassLoader

    你需要重写 findClass defineClass 在JVM中定义该类。

        2
  •  3
  •   Stephen C    15 年前

    除非您是通过一个复杂的类加载器运行代码,否则您应该能够执行以下操作:

    Class<?> clazz = ....
    String className = clazz.getCanonicalName();  // e.g. "foo.Bar"
    String resourceName = ... // map className to a resource name; e.g. "/foo/Bar.class" 
    InputStream is = clazz.getClassLoader.getResourceAsStream(resourceName);
    

    这将为您提供“.class”文件内容的句柄。。。如果能找到的话。

    注意事项。一些类加载器可能:

    • 给你一个加密的字节码流,或者
    • 由于类加载器执行的一些动态转换,给您提供的字节码并不完全是正在运行的字节码。

        3
  •  1
  •   Jeff Williams    13 年前

    您还可以为此使用Java Instrumentation API。在调用defineClass之前,您可以访问类文件的字节。你也可以改变他们!