核心接口:ClassFileTransformer
public class MyClassTransformer implements ClassFileTransformer {
/*实现ClassFileTransformer接口中的唯一方法。
*用于对类的转换,每加载一个类都会调用这个函数。
* classfileBuffer 是这个类的二进制形式,即所说的操作字节码就是操作这个字节数组。
*/
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
System.out.println("开始修改类" + className);
return classfileBuffer;
}
}
然后需要一个核心方法类似main
,可以在任意名字的一个类中
public class Premain {
/*
* 这个方法将在main函数被加载前执行。
* 通过addTransformer 加入 ClassFileTransformer的实现类。
* 方法签名不能变
*/
public static void premain(String agentArgs, Instrumentation inst) {
inst.addTransformer(new MyClassTransformer());
}
}
打成jar包,将premain
函数所在类指定为<Premain-Class>
。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Premain-Class>com.wutj.demo.Premain</Premain-Class>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
在需要这个agent的java程序的jvm参数中添加:
-javaagent:{agentjar位置}
更多参考https://www.ibm.com/developerworks/cn/java/j-lo-jse61/index.html