基于javaagent-ByteBuddy监控方法执行耗时

  • 前言
  • 目录结构
  • 环境准备
  • 测试结果

前言

  • 目的:不改造原有项目代码,通过字节码增强技术来实现方法调用耗时
  • 学习:最近学习Skywalking时偶然接触到有关字节码方面的知识,特地记录一下(还可以通过javassist来实现)
  • 参考资料:
    【黑马Skywalking】: java基础教程深入学习Skywalking全套教程

目录结构

环境准备

1. java-agent-demo项目pom:

    <properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!--解决字节码操作和Instrumentation API的复杂性--><dependency><groupId>net.bytebuddy</groupId><artifactId>byte-buddy</artifactId><version>1.9.2</version></dependency><dependency><groupId>net.bytebuddy</groupId><artifactId>byte-buddy-agent</artifactId><version>1.9.2</version></dependency></dependencies><build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><configuration><appendAssemblyId>false</appendAssemblyId><descriptorRefs><!--打包时加入依赖--><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><archive><!--自动生成/META-INF/MANIFEST.MF--><manifestEntries><Premain-Class>PreMainAgent</Premain-Class><Agent-Class>PreMainAgent</Agent-Class><Can-Redefine-Classes>true</Can-Redefine-Classes><Can-Retransform-Classes>true</Can-Retransform-Classes></manifestEntries></archive></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>

2. PreMainAgentl类:
注意:测试项目要以com.agent前缀开头才能被统计

import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.matcher.ElementMatchers;
import net.bytebuddy.utility.JavaModule;
import java.lang.instrument.Instrumentation;public class PreMainAgent {public static void premain(String agentParam, Instrumentation inst) {System.out.println("premain已经执行1" + agentParam);// method指定哪些方法需要被拦截,ElementMathers.any指定了所有的方法,声明intercept拦截器AgentBuilder.Transformer transformer = new AgentBuilder.Transformer() {@Overridepublic DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule) {return builder.method(ElementMatchers.<MethodDescription>any()).intercept(MethodDelegation.to(MyIntercept.class));}};/*** 1.type指定了agent拦截的包名,以[com.agent]作为前缀* 2.指定了转换器transformer* 3.将配置安装到Instrumentation*/new AgentBuilder.Default().type(ElementMatchers.<TypeDescription>nameStartsWith("com.agent")).transform(transformer).installOn(inst);}public static void premain(String agentParam) {System.out.println("premain已经执行2" + agentParam);}
}

3. MyIntercept类:

import net.bytebuddy.implementation.bind.annotation.Origin;
import net.bytebuddy.implementation.bind.annotation.RuntimeType;
import net.bytebuddy.implementation.bind.annotation.SuperCall;
import java.lang.reflect.Method;
import java.util.concurrent.Callable;public class MyIntercept  {@RuntimeTypepublic static Object intercept(@Origin Method method,@SuperCall Callable<?> callable) throws Exception {long start = System.currentTimeMillis();try {return callable.call();} finally {System.out.println(method + ":" + (System.currentTimeMillis() - start) + "ms");}}
}

4. Main类:
注意:测试项目要以com.agent前缀开头才能被统计

public class Main {public static void main(String[] args) throws InterruptedException {System.out.println("main方法执行");Thread.sleep(1000);}
}

测试结果

1. java-agent-demo打jar包
注意:记住java-agent-demo的jar包路径

2. 测试项目启动参数
在测试项目中的启动VM options添加一下参数,我自己随便用的参数:guantest

-javaagent:D:\project4\java-agent-demo\target\java-agent-demo-1.0-SNAPSHOT.jar=guantest


3. 测试结果

基于javaagent-ByteBuddy监控方法执行耗时相关推荐

  1. Java Agent简介及使用Byte Buddy和AspectJ LTW监控方法执行耗时

    1.什么是Java Agent Java Agent提供了一种在加载字节码时,对字节码进行修改的方法.一共有两种方式执行:一种是在main方法执行之前,通过premain来实现:另一种是在程序运行中, ...

  2. 字节码编程,Byte-buddy篇二《监控方法执行耗时动态获取出入参类型和值》

    作者:小傅哥 博客:https://bugstack.cn - 汇总系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 案例是剥去外衣包装展示出核心功能的最佳学习方式! 就像是我们研 ...

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

    背景描述 javaagent是在JDK5之后提供的新特性,也可以叫java代理.开发者通过这种机制(Instrumentation)可以在加载class文件之前修改方法的字节码(此时字节码尚未加入JV ...

  4. 【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行 ( 定义连接点注解 | 定义 Aspect 切面 | 定义切入点 | 逐个处理切入点的各个连接点 )

    文章目录 一.定义 Join Point 连接点注解 二.定义 Aspect 切面 1.定义 Aspect 切面 2.定义 Aspect 切面 3.逐个处理切入点的各个连接点 4.完整 Aspect ...

  5. iOS逆向之深入解析如何计算+load方法的耗时

    一.类方法 +load 在 pre-main 时期,objc 会向 dyld 注册一个 init 回调: void _objc_init(void) {static bool initialized ...

  6. java agent_GitHub - dingjs/javaagent: 基于javaagent开发的APM工具,收集方法的执行次数和执行时间,定时输出成json格式的日志。...

    Javaagent 概述 javaagent是一个简单优雅的java agent,利用java自带的instrument特性+javassist字节码编辑技术,实现了无侵入的方法级性能监控.相比于Ne ...

  7. linux进程看门狗使用方式,Linux系统中基于看门狗的精细化进程监控方法及系统的制作方法...

    Linux系统中基于看门狗的精细化进程监控方法及系统的制作方法 [技术领域] [0001] 本发明涉及Linux系统的进程监控技术领域,特别是涉及一种Linux系统中基于看 门狗的精细化进程监控方法及 ...

  8. Python语言学习:基于python五种方法实现使用某函数名【func_01】的字符串格式('func_01')来调用该函数【func_01】执行功能

    Python语言学习:基于python五种方法实现使用某函数名[func_01]的字符串格式('func_01')来调用该函数[func_01]执行功能 目录 问题提出 代码五种设计思路 T1方法:e ...

  9. linux 网络监控 邮件,一种基于Linux的邮件监控方法与流程

    本发明涉及计算机安全技术领域,具体地说是一种实用性强.基于Linux的邮件监控方法. 背景技术: 随着计算机的普及以及人们对个人信息安全的重视,如何保障计算机乃至个人信息的安全成为了一个至关重要的问题 ...

最新文章

  1. Spring 自动化装配Bean
  2. 广东2021高考成绩查询6,2021全国高考6月10日全部结束 预计最快6月23日可查高考成绩...
  3. 关于libStagefright系列漏洞分析
  4. Centos Git1.7.1升级到Git2.2.1
  5. js常用阻止冒泡事件
  6. 机器学习算法源码全解析(三)-范数规则化之核范数与规则项参数选择
  7. linux命令速查手册_干货| 有了这个速查手册,还怕Linux命令记不住?
  8. 安卓逆向_10 --- Log 日志的插入和分析、toast方法、栈跟踪
  9. [转载] Python中的xrange和range的区别
  10. windows定时任务python shutil_python- shutil 高级文件操作
  11. gensim读取已训练模型LDA模型的模型与dictionary
  12. android的xml登录,Android----xml文件中的控件的id设置
  13. curl的php多线程类,php利用curl实现多线程类的示例
  14. 部分更新没有安装 KB4535102
  15. JSP完成添加商品时的图片上传
  16. 六面体单元的体积计算方法
  17. 用这个方法1分钟能批量下载上百张图片,亲测有效速度快
  18. 本学期3个sprint的团队贡献分
  19. 即构推出视频见证系统方案,全面支持泛金融实时双录
  20. 三国演义告诉我们的60条真理

热门文章

  1. 如何选择值得深入学习的技术方向
  2. Linux环境使用授权码实现软件授权
  3. C语言写的学生管理系统
  4. Altium Designer PCB 插入图片logo的方法
  5. 就靠一刀999的手游广告,这些隐形公司可以月赚百万
  6. 如何炒股,炒股的最简单方法
  7. 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界 光照与材质专场
  8. 基于QT的游戏修改器
  9. The Moo Particle
  10. 苏嵌//张福辉//2018.7.24