【问题标题】:How to manipulate a class' bytecode just before it is loaded?如何在加载类的字节码之前对其进行操作?
【发布时间】:2019-06-29 15:10:57
【问题描述】:

我正在尝试找到一种在加载类之前(在运行时)操作字节码的方法。我需要这样做,因为操作取决于main 之前不存在的东西(并且可能在加载主题类之前)。

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

现在,我想知道在运行时的特定时间点或在加载类之前操作字节码的最佳方法是什么,以及在 Java 9+ 中是否仍然可以这样做。

【问题讨论】:

标签: java jvm bytecode javaagents bytecode-manipulation


【解决方案1】:

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

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

在较新的版本 (9+) 中,执行此操作所需的依赖项 (tools.jar) 似乎不再存在

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-27
    • 2023-03-16
    • 1970-01-01
    • 2023-03-23
    • 2017-11-29
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    相关资源
    最近更新 更多