我正在试图找到一种在加载类之前操纵类的字节码的方法(在运行时)。我需要这样做,因为操作依赖于在main之前(并且可能在加载subject类之前)不存在的东西。
我已经看过java代理了。premain方法在这里显然不适用,因为它是在main之前执行的,这意味着它不能依赖于在main中设置的东西。另一种选择似乎是agentmain和manually loading the agent at runtime。现在的问题是,在较新的版本(9+)中,所需的依赖项(tools.jar)似乎不再存在。
现在,我想知道在运行时的某个特定点或在类加载之前操作字节码的最佳方法是什么,以及在Java9+中是否仍然可以这样做。
发布于 2019-06-29 16:45:45
premain方法在这里显然不适用,因为它是在main之前执行的,这意味着它不能依赖于在main中设置的东西
这不是真的。代理不需要在代理加载时立即修改类字节码。它可以注册ClassFileTransformer并将字节码操作推迟到稍后加载目标类。或者,代理可以简单地保存Instrumentation实例,以便在任何方便的时间使用。
在较新的版本(9+)中,所需的依赖项(tools.jar)似乎不再存在。
这也是不完全正确的。附加API存在于所有新版本的JDK中。由于JDK 9不再需要tools.jar,而是属于jdk.attach模块。
为了便于在运行时附加,可以使用byte-buddy-agent或独立的jattach实用程序。两者都与JDK 8以及JDK 9+一起工作。
https://stackoverflow.com/questions/56818607
复制相似问题