参考文章
https://tech.meituan.com/2019/11/07/java-dynamic-debugging-technology.html
https://docs.oracle.com/en/java/javase/20/docs/specs/jvmti.html
基本使用
Java Agent提供了一种在加载字节码时对字节码进行修改的能力,有两种实现方式:
- 在应用启动之时,通过
premain()
方法来实现在应用启动时侵入 - 针对运行中的JVM,通过Attach API和
agentmain()
方法来实现侵入
premain
通过JVM参数-javaagent:*.jar
启动应用。应用在启动时,会优先加载Java Agent,并执行premain()方法,这时部分的类都还没有被加载。此时,可以实现对新加载的类进行字节码修改,但如果premain()方法执行失败或者抛出异常,则JVM会被终止。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
<manifestEntries>
<!--指定包含premain方法的类,需要配置为类的全路径名,必须配置-->
<Premain-Class>org.example.PreMainAgent</Premain-Class>
<!--是否可以重新定义class,默认为false,可选配置-->
<Can-Redefine-Classes>true</Can-Redefine-Classes>
<!--是否可以重新转换class,实现字节码替换,默认为false,可选配置-->
<