如何在加载类之前对类的字节码进行操作?

时间:2019-06-29 15:10:57

标签: java jvm bytecode javaagents bytecode-manipulation

我试图找到一种在加载类之前(在运行时)操纵类的字节码的方法。我之所以需要这样做,是因为该操作依赖于main之前(以及可能在加载主题类之前)不存在的某些东西。

我已经看过Java代理了。 premain方法显然不适用于此处,因为它是在main之前执行的,这意味着它不能依赖于main中设置的内容。 另一个选项似乎是agentmainmanually loading the agent at runtime。现在的问题是,在较新版本(9+)中,似乎不再存在执行该操作所需的依赖项(tools.jar)。

现在,我想知道在运行时的特定时间或在加载类之前,以及如果仍然可以使用Java 9+进行操作的最佳方式,什么是操作字节码的最佳方法。

1 个答案:

答案 0 :(得分:1)

  

premain方法显然不适用于此处,因为它是   在main之前执行,这意味着它不能依赖于   在main

中设置

这不是事实。代理不需要在代理加载时立即修改类字节码。它可能只是注册ClassFileTransformer并推迟字节码操作,直到以后加载目标类为止。另外,代理可以简单地保存Instrumentation实例,以便以后在任何方便的时间使用。

  在较新版本(9+)中,

  (tools.jar)似乎不再存在

这也不是很正确。所有新版本的JDK中都存在附加API。从JDK 9开始,它不再需要tools.jar,而是属于jdk.attach模块。

为便于在运行时进行附加,您可以使用byte-buddy-agent或独立的jattach实用程序。两者都可以与JDK 8以及JDK 9+一起使用。