【发布时间】:2019-06-29 15:10:57
【问题描述】:
我正在尝试找到一种在加载类之前(在运行时)操作字节码的方法。我需要这样做,因为操作取决于main 之前不存在的东西(并且可能在加载主题类之前)。
我已经看过 java 代理了。 premain 方法在这里显然不适用,因为它在main 之前执行,这意味着它不能依赖于main 中设置的东西。
另一个选项似乎是agentmain 和manually loading the agent at runtime。现在的问题是,在较新的版本 (9+) 中,执行此操作所需的依赖项 (tools.jar) 似乎不再存在。
现在,我想知道在运行时的特定时间点或在加载类之前操作字节码的最佳方法是什么,以及在 Java 9+ 中是否仍然可以这样做。
【问题讨论】:
-
我认为这些工具是“存在的”,但默认情况下不存在。由于新的发布计划,他们改变了 Java JDK 在 Java 8 之后的分发方式。不知道他们去了哪里,四处打听,我相信你能找到他们。
-
在
premain你只是添加了transformer,它不会马上被使用。稍后将在加载类之前使用它 - 检查 jrebel.com/rebellabs/how-to-inspect-classes-in-your-jvm 和 docs.oracle.com/javase/7/docs/api/java/lang/instrument/…
标签: java jvm bytecode javaagents bytecode-manipulation