1、简介
javaagent 是 Java1.5 之后引入的新特性,其主要作用是在class被加载之前对其拦截,以插入我们的字节码。
java1.5 之前使用的是JVMTI(jvm tool interface)技术来实现对class的拦截,不过这个是用 C++ 编写的,比如 debug 功能就是用这个技术实现的。
2、jar包
常见的jar包分为 可运行jar 和 javaagent.jar ,它们的主要区别如下:
Executable Jar | Javaagent Jar | |
---|---|---|
入口方法 | main | premain |
打包参数 | Main-Class | Premain-Class |
启动方式 | java -jar xxx.jar | -javaagent:xxx.jar=dddd |
是否可启动 | 是 | 否 |
3、可运行 jar 包
入口方法
package com.ybw;
public class TestMain {
// 这个是我们经常写的
public static void main(String[] args) {
System.out.println("hello main");
}
}
pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ybw</groupId>
<artifactId>test-main</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.4.2</version>
<configuration>
<archive>
<!--指定 Main-Class 来指定可运行 jar 的主类 -->
<manifest>
<mainClass>com.ybw.TestMain</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
打包jar
mvn package
打包后会生成 target文件,并且生成 jar 包。
4、javaagent.jar
入口方法
package com.ybw;
import java.lang.instrument.Instrumentation;
public class TestAgent {
public static void premain(String arg, Instrumentation instrumentation) {
System.out.println("javaagent arg=" + arg);
}
}
pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ybw</groupId>
<artifactId>agent-demo</artifactId>
<version>1.0.0</version>
<name>agent-demo</name>
<description>agent-demo</description>
<properties>
<java.version>21</java.version>
</properties>
<dependencies>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.4.2</version>
<configuration>
<archive>
<!--方法一:MANIFEST.MF 配置文件-->
<!--<manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>-->
<!--方法二: pom 指定配置-->
<manifestEntries>
<Premain-Class>com.ybw.TestAgent</Premain-Class>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
打包jar
mvn package
打包后会生成 target文件,并且生成 jar 包。
5、执行
两个项目执行了 package 之后,把 target\agent-demo-1.0.0.jar 和 **target\**test-main-1.0.0.jar移动到同一个文件夹下。然后执行命令
$ c:/jdk21/bin/java -javaagent:agent-demo-1.0.0.jar=test -jar test-main-1.0.0.jar
javaagent arg=test
hello main