byte buddy字节码增强——输出方法执行时间

news/2024/5/15 20:44:05

目标: 输出各函数执行时间

  1. 引包
<?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>org.example</groupId><artifactId>bytebuddyTest</artifactId><version>1.0-SNAPSHOT</version><properties></properties><dependencies><dependency><groupId>net.bytebuddy</groupId><artifactId>byte-buddy</artifactId><version>1.8.20</version></dependency><dependency><groupId>net.bytebuddy</groupId><artifactId>byte-buddy-agent</artifactId><version>1.8.20</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>8</source><target>8</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive>// maven中指定Premain-Class<manifestEntries><Premain-Class>buddy.agent.MethodAgent</Premain-Class><Can-Redefine-Classes>true</Can-Redefine-Classes><Can-Retransform-Classes>true</Can-Retransform-Classes></manifestEntries></archive></configuration></plugin></plugins></build></project>
  1. Pre-Main 操作类
package buddy.agent;import net.bytebuddy.agent.builder.AgentBuilder;
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 MethodAgent {public static void premain(String args, Instrumentation instrumentation) {System.err.println("MethodAgent " + args);AgentBuilder.Transformer transformer = (builder, typeDescription, classLoader, javaModule) -> {return builder.method(ElementMatchers.any()).intercept(MethodDelegation.to(MethodTimeCheck.class));};AgentBuilder.Listener listener = new AgentBuilder.Listener() {@Overridepublic void onDiscovery(String s, ClassLoader classLoader, JavaModule javaModule, boolean b) {System.out.println(s + " onDiscovery");}@Overridepublic void onTransformation(TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule, boolean b, DynamicType dynamicType) {System.out.println(typeDescription + " onTransformation");}@Overridepublic void onIgnored(TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule, boolean b) {System.out.println(typeDescription + " onIgnored");}@Overridepublic void onError(String s, ClassLoader classLoader, JavaModule javaModule, boolean b, Throwable throwable) {throwable.printStackTrace();}@Overridepublic void onComplete(String s, ClassLoader classLoader, JavaModule javaModule, boolean b) {System.out.println(s + " onComplete");}};new AgentBuilder.Default().type(ElementMatchers.nameStartsWith("buddy.say")).transform(transformer).with(listener).installOn(instrumentation);}
}

拦截器处理类

package buddy.agent;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 MethodTimeCheck {@RuntimeTypepublic static void interceptor(@Origin Method method, @SuperCall Callable<?> callable) {long startTime =System.currentTimeMillis();try {callable.call();} catch (Exception e) {e.printStackTrace();} finally {System.out.println(method + " cost " + (System.currentTimeMillis() - startTime) + " ms");}}}
  1. maven 打包,然后在VM option 中添加 -javaagent:XXX(your path).jar=args
  2. 测试类
package buddy.say;public class HelloMethod {public void say() {try {Thread.sleep(1000);System.out.println("execute OK~");} catch (Exception e) {e.printStackTrace();}}
}
package buddy;import buddy.say.HelloMethod;public class StartExecute {public static void main(String[] args) {HelloMethod helloMethod = new HelloMethod();helloMethod.say();}
}

在这里插入图片描述

结束 ~ ~ (^ v ^)~ ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.tangninghui.cn.cn/item-60.htm

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

MATLAB入门-字符串操作

MATLAB入门-字符串操作 注&#xff1a;本篇文章是学习笔记&#xff0c;课程链接是&#xff1a;link MATLAB中的字符串特性&#xff1a; 无论是字符还是字符串&#xff0c;都要使用单引号来‘’表示&#xff1b;在MATLAB中&#xff0c;字符都是在矩阵中存储的&#xff0c;无论…

干洗店洗鞋店线上下单小程序方便快捷

在线下单是干洗店小程序最直接满足顾客使用需求的一项功能&#xff0c;让顾客能够直观了解到不同规格不同方式清洁衣物干洗的价格并且能够直接在线下单&#xff0c;能够极大缩短消费环节&#xff0c;提升下单可能性&#xff0c;管理后台还能够同步记录顾客订单数据&#xff0c;…

flink的物理DataFlow图及Slot处理槽任务分配

背景 在flink中&#xff0c;有几个比较重要的概念&#xff0c;逻辑DataFlow图&#xff0c;物理DataFlow图以及处理槽执行任务&#xff0c;本文就来讲解下这几个概念 概念详解 假设有以下代码&#xff1a;数据源和统计单词算子的并行度是2&#xff0c;数据汇算子的并行度是1&…

Light Image v6.1.8.0批量调整图片大小

Light Image Resizer&#xff0c;批量调整图片大小工具&#xff0c;图片批量添加水印&#xff0c; 批量转换图像格式、调整图片大小、缩放裁剪&#xff0c;图片格式转换、 重命名&#xff0c;排序&#xff1b;添加效果&#xff0c;旋转&#xff0c;自定义元数据&#xff0c;优…

C语言之初阶总结篇

目录 NO.1 NO.2 NO.3 NO.4 NO.5 NO.6 NO.7 NO.8 NO.9 NO.10 NO.11 NO.12.概念tips NO.13.求最小公倍数 NO.14.最大公因数 NO.15.输入读取字符串 NO.16.倒置字符串 今天是一些C语言题目&#xff0c;最近天气炎热&#xff0c;多喝水。 NO.1 下面程序执行后&am…

数据结构与算法:树

目录 树 定义 结构 二叉树 定义 结构 形式 满二叉树 完全二叉树 存储 链式存储结构 数组 孩子节点 父节点 应用 查找 维持相对顺序 遍历 深度优先遍历 前序遍历 中序遍历 后序遍历 广度优先遍历 层序遍历 二叉堆 定义 自我调整 操作 插入加点 删…