千寻位置 开发demo_java程序开发,使用javaagent无侵入代码方式,监控方法执行耗时...

背景描述

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

代码示例

f54bcc128f39843ab7edc044ee154813.png

pom.xml

 org.javassist javassist 3.22.0-GA

MyAgent.java

ee4baa3a19b4a8b4c32dd4031336dd4b.png

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("/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值