背景描述
javaagent是在JDK5之后提供的新特性,也可以叫java代理。开发者通过这种机制(Instrumentation)可以在加载class文件之前修改方法的字节码(此时字节码尚未加入JVM),动态更改类方法实现AOP,提供监控服务如;方法调用时长、可用率、内存等。
开发简述
通过实现ClassFileTransformer接口方法,动态更改方法的字节码。在方法前后加上时间戳,最后执行完成输出执行时长。
环境准备
1、IntelliJ IDEA Community Edition 2018.3.1 x64
2、jdk1.8 64位
配置信息(路径相关修改为自己的)
1、java调试时配置
2.1、配置位置:Run/Debug Configurations ->VM options
2.2、配置内容(编译后的jar放到根目录下):-javaagent:E:itstack-demo-javaagent-1.0-SNAPSHOT.jar=agentargs
代码示例
pom.xml
org.javassist javassist 3.22.0-GA
MyAgent.java
MyTransformer.java
public class MyTransformer implements ClassFileTransformer { private final static String prefix = "long startTime = System.currentTimeMillis();"; private final static String postfix = "long endTime = System.currentTimeMillis();"; // 被处理的方法列表 private final static Map> methodMap = new HashMap>(); public MyTransformer() { //对指定方法监控 add("org.itstack.demo.test.AgentTest.queryUserAge"); add("org.itstack.demo.test.AgentTest.queryUserName"); } private void add(String methodString) { String className = methodString.substring(0, methodString.lastIndexOf(".")); String methodName = methodString.substring(methodString.lastIndexOf(".") + 1); List list = methodMap.get(className); if (list == null) { list = new ArrayList(); methodMap.put(className, list); } list.add(methodName); } @Override public byte[] transform(ClassLoader loader, String className, Class> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { className = className.replace("/