1.创建MyAgent项目,加入依赖:
<?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>cn.edu.tju</groupId>
<artifactId>myagent</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>7</source>
<target>7</target>
</configuration>
</plugin>
<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-Class>cn.edu.tju.agent.MyAgent</Premain-Class>
<Agent-Class>cn.edu.tju.agent.MyAgent</Agent-Class>
<Can-Redefine-Classes>true</Can-Redefine-Classes>
<Can-Retransform-Classes>true</Can-Retransform-Classes>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.24.1-GA</version>
</dependency>
</dependencies>
</project>
2.创建两个类:
package cn.edu.tju.agent;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.NotFoundException;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;
public class MyClassFileTransformer implements ClassFileTransformer {
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
if(className.endsWith("sun/net/www/protocol/http/HttpURLConnection")){
try {
ClassPool classPool = new ClassPool(true);
CtClass clazz = null;
clazz = classPool.get("sun.net.www.protocol.http.HttpURLConnection");
CtConstructor[] cs = clazz.getConstructors();
for(CtConstructor constructor: cs){
constructor.insertAfter("System.out.println(this.getURL());");
}
byte[] byteCode = clazz.toBytecode();
clazz.detach();
return byteCode;
} catch (Throwable ex) {
ex.printStackTrace();
System.out.println("hi: "+ex.getMessage());
}
}
return null;
}
}
package cn.edu.tju.agent;
import java.lang.instrument.Instrumentation;
public class MyAgent {
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("in premain......");
MyClassFileTransformer myClassFileTransformer = new MyClassFileTransformer();
inst.addTransformer(myClassFileTransformer);
}
}
其中MyAgent类是作为java agent来使用的。
3.打包成jar文件
4.创建AgentTestProject项目,并加入依赖,
<?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>cn.edu.tju</groupId>
<artifactId>AgentTestProject</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.24.1-GA</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>7</source>
<target>7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
5.创建测试类:
package cn.edu.tju;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class Start {
public static void main( String[] args ) throws IOException {
System.out.println("in main......");
curl("http://www.baidu.com");
}
private static void curl(String address) throws IOException {
final URL url = new URL(address);
final URLConnection connection = url.openConnection();
try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))){
String oneLine = null;
StringBuffer sb = new StringBuffer();
while ((oneLine = in.readLine()) != null){
sb.append(oneLine);
}
System.out.println("content size:" + sb.length());
}
}
}
6.配置AgentTestProject项目的JVM参数:
其中vm options里配置的agent参数为MyAgent项目jar包的路径:
-javaagent:D:/6666/MyAgent/target/myagent-1.0-SNAPSHOT.jar
7.运行测试类,结果如下: