Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >字节码编程,Byte-buddy篇二《监控方法执行耗时动态获取出入参类型和值》

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

原创
作者头像
小傅哥
修改于 2020-05-14 02:23:19
修改于 2020-05-14 02:23:19
1.7K0
举报

作者:小傅哥

博客:https://bugstack.cn

沉淀、分享、成长,让自己和他人都能有所收获!

一、前言

案例是剥去外衣包装展示出核心功能的最佳学习方式!

就像是我们研究字节码编程最终是需要应用到实际场景中,例如:实现一款非入侵的全链路最终监控系统,那么这里就会包括一些基本的核心功能点;方法执行耗时出入参获取异常捕获添加链路ID等等。而这些一个个的功能点,最快的掌握方式就是去实现他最基本的功能验证,这个阶段基本也是技术选型的阶段,验证各项技术点是否可以满足你后续开发的需求。否则在后续开发中,如果已经走了很远的时候再发现不适合,那么到时候就很麻烦了。

在前面的ASMJavassist 章节中也有陆续实现过获取方法的出入参信息,但实现的方式还是偏向于字节码控制,尤其ASM,更是需要使用到字节码指令将入参信息压栈操作保存到局部变量用于输出,在这个过程中需要深入了解Java虚拟机规范,否则很不好完成这一项的开发。但!ASM也是性能最牛的。其他的字节码编程框架都是基于它所开发的。关于这部分系列文章可以访问链接进行专题系列的学习https://bugstack.cn/itstack/itstack-demo-bytecode.html

那么,本章节我们会使用 Byte-buddy 来实现这一功能,在接下来的操作中你会感受到这个字节码框架的魅力,它的API更加高级也更符合普遍易接受的操作方式进行处理。

二、开发环境

  1. JDK 1.8.0
  2. byte-buddy 1.10.9
  3. byte-buddy-agent 1.10.9
  4. 本章涉及源码在:itstack-demo-bytecode-2-02,可以关注公众号bugstack虫洞栈,回复源码下载获取。你会获得一个下载链接列表,打开后里面的第17个「因为我有好多开源代码」,记得给个Star

三、案例目标

在这里我们定义一个类并创建出等待被监控的方法,当方法执行时监控方法的各项信息;执行耗时出入参信息等。

代码语言:txt
AI代码解释
复制
public class BizMethod {

    public String queryUserInfo(String uid, String token) throws InterruptedException {
        Thread.sleep(new Random().nextInt(500));
        return "德莱联盟,王牌工程师。小傅哥(公众号:bugstack虫洞栈),申请出栈!";
    }

}
  • 我们这里模拟监控并没有使用 Javaagent 去做字节码加载时的增强,主要为了将最核心的内容体现出来。后续的章节会陆续讲解各个核心功能的组合使用,做出一套监控系统。

四、技术实现

在技术实现的过程中,我会陆续的将需要监控的内容一步步完善。这样将一个总体的内容进行拆解后,方便学习和理解。

1. 创建监控主体类

代码语言:txt
AI代码解释
复制
@Test
public void test_byteBuddy() throws Exception {
    DynamicType.Unloaded<?> dynamicType = new ByteBuddy()
            .subclass(BizMethod.class)
            .method(ElementMatchers.named("queryUserInfo"))
            .intercept(MethodDelegation.to(MonitorDemo.class))
            .make();

    // 加载类
    Class<?> clazz = dynamicType.load(ApiTest.class.getClassLoader())
            .getLoaded();  

    // 反射调用
    clazz.getMethod("queryUserInfo", String.class, String.class).invoke(clazz.newInstance(), "10001", "Adhl9dkl");
}
  • 这一部分是 Byte Buddy 的模版代码,定义需要被加载的类和方法;BizMethod.classElementMatchers.named("queryUserInfo"),这一步也就是让程序可以定位到你的被监控内容。
  • 接下来就是最重要的一部分委托MethodDelegation.to(MonitorDemo.class),最终所有的监控操作都会被 MonitorDemo.class 类中的方法进行处理。
  • 最后就是类的加载和反射调用,这部分主要用于每次的测试验证。查找方法,传递对象和入参信息

2. 监控方法耗时

如上一步所述这里主要需要使用到,委托类进行控制监控信息。

代码语言:txt
AI代码解释
复制
public class MonitorDemo {

    @RuntimeType
    public static Object intercept(@SuperCall Callable<?> callable) throws Exception {
        long start = System.currentTimeMillis();
        try {
            return callable.call();
        } finally {
            System.out.println("方法耗时:" + (System.currentTimeMillis() - start) + "ms");
        }
    }

}
  • 这里面包括几个核心的知识点;@RuntimeType:定义运行时的目标方法。@SuperCall:用于调用父类版本的方法。
  • 定义好方法后,下面有一个 callable.call(); 这个方法是调用原方法的内容,返回结果。而前后包装的。
  • 最后在finally中,打印方法的执行耗时。System.currentTimeMillis() - start

测试结果:

代码语言:txt
AI代码解释
复制
方法耗时:419ms

Process finished with exit code 0

3. 获取方法信息

获取方法信息的过程其实就是在获取方法的描述内容,也就是你编写的方法拆解为各个内容进行输出。那么为了实现这样的功能我们需要使用到新的注解 @Origin Method method

代码语言:txt
AI代码解释
复制
@RuntimeType
public static Object intercept(@Origin Method method, @SuperCall Callable<?> callable) throws Exception {
    long start = System.currentTimeMillis();
    Object resObj = null;
    try {
        resObj = callable.call();
        return resObj;
    } finally {
        System.out.println("方法名称:" + method.getName());
        System.out.println("入参个数:" + method.getParameterCount());
        System.out.println("入参类型:" + method.getParameterTypes()[0].getTypeName() + "、" + method.getParameterTypes()[1].getTypeName());
        System.out.println("出参类型:" + method.getReturnType().getName());
        System.out.println("出参结果:" + resObj);
        System.out.println("方法耗时:" + (System.currentTimeMillis() - start) + "ms");
    }
}
  • @Origin,用于拦截原有方法,这样就可以获取到方法中的相关信息。
  • 这一部分的信息相对来说比较全,尤其也获取到了参数的个数和类型,这样就可以在后续的处理参数时进行循环输出。

测试结果:

代码语言:txt
AI代码解释
复制
方法名称:queryUserInfo
入参个数:2
入参类型:java.lang.String、java.lang.String
出参类型:java.lang.String
出参结果:德莱联盟,王牌工程师。小傅哥(公众号:bugstack虫洞栈),申请出栈!
方法耗时:490ms

Process finished with exit code 0

4. 获取入参内容

当我们能获取入参的基本描述以后,再者就是获取入参的内容。在一段方法执行的过程中,如果可以在必要的时候拿到当时入参的信息,那么就可以非常方便的进行排查异常快速定位问题。在这里我们会用到新的注解;@AllArguments@Argument(0),一个用于获取全部参数,一个获取指定的参数。

代码语言:txt
AI代码解释
复制
@RuntimeType
public static Object intercept(@Origin Method method, @AllArguments Object[] args, @Argument(0) Object arg0, @SuperCall Callable<?> callable) throws Exception {
    long start = System.currentTimeMillis();
    Object resObj = null;
    try {
        resObj = callable.call();
        return resObj;
    } finally {
        System.out.println("方法名称:" + method.getName());
        System.out.println("入参个数:" + method.getParameterCount());
        System.out.println("入参类型:" + method.getParameterTypes()[0].getTypeName() + "、" + method.getParameterTypes()[1].getTypeName());
        System.out.println("入参内容:" + arg0 + "、" + args[1]);
        System.out.println("出参类型:" + method.getReturnType().getName());
        System.out.println("出参结果:" + resObj);
        System.out.println("方法耗时:" + (System.currentTimeMillis() - start) + "ms");
    }
}
  • 与上面的代码块相比,多了参数的获取和打印。主要知道这个方法就可以很方便的获取入参的内容。

测试结果:

代码语言:txt
AI代码解释
复制
方法名称:queryUserInfo
入参个数:2
入参类型:java.lang.String、java.lang.String
入参内容:10001、Adhl9dkl
出参类型:java.lang.String
出参结果:德莱联盟,王牌工程师。小傅哥(公众号:bugstack虫洞栈),申请出栈!
方法耗时:405ms

Process finished with exit code 0

5. 其他注解汇总

除了以上为了获取方法的执行信息使用到的注解外,Byte Buddy 还提供了很多其他的注解。如下;

注解

说明

@Argument

绑定单个参数

@AllArguments

绑定所有参数的数组

@This

当前被拦截的、动态生成的那个对象

@Super

当前被拦截的、动态生成的那个对象的父类对象

@Origin

可以绑定到以下类型的参数:Method 被调用的原始方法 Constructor 被调用的原始构造器 Class 当前动态创建的类 MethodHandle MethodType String 动态类的toString()的返回值 int 动态方法的修饰符

@DefaultCall

调用默认方法而非super的方法

@SuperCall

用于调用父类版本的方法

@Super

注入父类型对象,可以是接口,从而调用它的任何方法

@RuntimeType

可以用在返回值、参数上,提示ByteBuddy禁用严格的类型检查

@Empty

注入参数的类型的默认值

@StubValue

注入一个存根值。对于返回引用、void的方法,注入null;对于返回原始类型的方法,注入0

@FieldValue

注入被拦截对象的一个字段的值

@Morph

类似于@SuperCall,但是允许指定调用参数

6. 常用核心API

  1. ByteBuddy
    • 流式API方式的入口类
    • 提供Subclassing/Redefining/Rebasing方式改写字节码
    • 所有的操作依赖DynamicType.Builder进行,创建不可变的对象
  2. ElementMatchers(ElementMatcher)
    • 提供一系列的元素匹配的工具类(named/any/nameEndsWith等等)
    • ElementMatcher(提供对类型、方法、字段、注解进行matches的方式,类似于Predicate)
    • Junction对多个ElementMatcher进行了and/or操作
  3. DynamicType(动态类型,所有字节码操作的开始,非常值得关注)
    • Unloaded(动态创建的字节码还未加载进入到虚拟机,需要类加载器进行加载)
    • Loaded(已加载到jvm中后,解析出Class表示)
    • Default(DynamicType的默认实现,完成相关实际操作)
  4. Implementation(用于提供动态方法的实现)
    • FixedValue(方法调用返回固定值)
    • MethodDelegation(方法调用委托,支持两种方式: Class的static方法调用、object的instance method方法调用)
  5. Builder(用于创建DynamicType,相关接口以及实现后续待详解)
    • MethodDefinition
    • FieldDefinition
    • AbstractBase

五、总结

  • 在这一章节的实现过程来看,只要知道相关API就可以很方便的解决我们的监控方法信息的诉求,他所处理的方式非常易于使用。而在本章节中也要学会几个关键知识点;委托、方法注解、返回值注解以及入参注解。
  • 当我们学会了监控的核心功能,在后续与Javaagent结合使用时就可以很容易扩展进去,而不是看到了陌生的代码。对于这一部分非入侵的入侵链路监控,也是目前比较热门的话题和需要探索的解决方案,就像最近阿里云也举办了类似的编程挑战赛。首届云原生编程挑战赛1:实现一个分布式统计和过滤的链路追踪
  • 关于字节码编程专栏已经完成了大部分文章的编写,包括如下文章;(学习链接https://bugstack.cn/itstack/itstack-demo-bytecode.html)
代码语言:txt
AI代码解释
复制
- [`字节码编程,Byte-buddy篇一《基于Byte Buddy语法创建的第一个HelloWorld》`](https://bugstack.cn/itstack/itstack-demo-bytecode.html)
- [`字节码编程,Javassist篇五《使用Bytecode指令码生成含有自定义注解的类和方法》`](https://bugstack.cn/itstack/itstack-demo-bytecode.html)
- [`字节码编程,Javassist篇四《通过字节码插桩监控方法采集运行时入参出参和异常信息》`](https://bugstack.cn/itstack/itstack-demo-bytecode.html)
- [`字节码编程,Javassist篇三《使用Javassist在运行时重新加载类「替换原方法输出不一样的结果」》`](https://bugstack.cn/itstack/itstack-demo-bytecode.html)
- [`字节码编程,Javassist篇二《定义属性以及创建方法时多种入参和出参类型的使用》`](https://bugstack.cn/itstack/itstack-demo-bytecode.html)
- [`字节码编程,Javassist篇一《基于javassist的第一个案例helloworld》`](https://bugstack.cn/itstack/itstack-demo-bytecode.html)
- [`ASM字节码编程 | 用字节码增强技术给所有方法加上TryCatch捕获异常并输出`](https://bugstack.cn/itstack/itstack-demo-bytecode.html)
- [`ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称以及入参和出参结果并记录方法耗时`](https://bugstack.cn/itstack/itstack-demo-bytecode.html)
- [`ASM字节码编程 | 如果你只写CRUD,那这种技术你永远碰不到`](https://bugstack.cn/itstack/itstack-demo-bytecode.html)
  • 最佳的学习体验和方式是,在学习和探索的过程中不断的对知识进行深度的学习,通过一个个实践的方式让知识成结构化和体系的建设。

六、彩蛋

CodeGuide | 程序员编码指南 Go!

本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、点赞、分享)!

CodeGuide | 程序员编码指南
CodeGuide | 程序员编码指南

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
字节码编程,Byte-buddy篇二《监控方法执行耗时动态获取出入参类型和值》
就像是我们研究字节码编程最终是需要应用到实际场景中,例如:实现一款非入侵的全链路最终监控系统,那么这里就会包括一些基本的核心功能点;方法执行耗时、出入参获取、异常捕获、添加链路ID等等。而这些一个个的功能点,最快的掌握方式就是去实现他最基本的功能验证,这个阶段基本也是技术选型的阶段,验证各项技术点是否可以满足你后续开发的需求。否则在后续开发中,如果已经走了很远的时候再发现不适合,那么到时候就很麻烦了。
小傅哥
2020/07/14
1.3K0
调研字节码插桩技术,用于系统监控设计和实现
周末熟睡的深夜,突然接到老板电话☎的催促。“赶紧看微信、看微信,咋系统出问题了,我们都不知道,还得用户反馈才知道的!!!”深夜爬起来,打开电脑连上 VPN ,打着哈欠、睁开朦胧的眼睛,查查系统日志,原来是系统挂了,赶紧重启恢复!
小傅哥
2021/07/23
1.1K0
基于JavaAgent的全链路监控三《ByteBuddy操作监控方法字节码》
案例简述 在第二章中我们已经可以监控方法执行耗时,虽然它能完成我们一些基本需要,但是为了增强代码的扩展性,我们需要使用字节码操作工具ByteBuddy来帮助我们实现更完善的监控程序。
小傅哥
2020/07/14
2.1K0
字节码编程,Byte-buddy篇一《基于Byte Buddy语法创建的第一个HelloWorld》
相对于小傅哥之前编写的字节码编程; ASM、Javassist 系列,Byte Buddy 玩法上更加高级,你可以完全不需要了解一个类和方法块是如何通过 指令码 LDC、LOAD、STORE、IRETURN... 生成出来的。就像它的官网介绍;
小傅哥
2020/05/08
1K0
字节码编程,Byte-buddy篇一《基于Byte Buddy语法创建的第一个HelloWorld》
方案设计:基于IDEA插件开发和字节码插桩技术,实现研发交付质量自动分析
业务提需求,产品定方案,研发做实现,测试验流程。四种角色的相互配合是确保一个需求上线的必备条件。在整个需求的交付质量级别划分中,研发与测试是非常重的一环,如果研发提测的代码质量不高,就会出现不同级别的修BUG、返工甚至重做的风险。
小傅哥
2021/02/23
10.1K0
方案设计:基于IDEA插件开发和字节码插桩技术,实现研发交付质量自动分析
java agent和byte-buddy组合的简单使用
java agent开了一扇门,bytebuddy在开的这扇门中打开了一片新的天地。比较典型的就是skywalking、sermant、arthas、mockito、fastjson等。是不是很好奇skywalking、sermant、arthas、mockito、fastjson的原理。下面我们来了解一下。
路行的亚洲
2024/02/17
9620
java agent和byte-buddy组合的简单使用
字节码编程,Byte-buddy篇三《使用委托实现抽象类方法并注入自定义注解信息》
截至到本章节关于字节码框架 Byte-buddy 的大部分常用 API 的使用已经通过案例介绍比较全面了,接下来介绍关于如何去实现一个抽象类以及创建出相应注解(包括类的注解和方法的注解)的知识点。而注解的这部分内容在一些监控或者拦截处理的场景下还是比较常用的,所以在这章节我们会通过一个例子来创建出含有自定义注解的类和方法。
小傅哥
2020/07/14
7930
JavaAgent+ASM字节码插桩采集方法名称以及入参和出参结果并记录方法耗时
在我们实际的业务开发到上线的过程中,中间都会经过测试。那么怎么来保证测试质量呢?比如;提交了多少代码、提交了多少方法、有单元测试吗、影响了那些流程链路、有没有夹带上线。
小傅哥
2020/04/07
3.2K1
JavaAgent+ASM字节码插桩采集方法名称以及入参和出参结果并记录方法耗时
字节码编程,Javassist篇四《通过字节码插桩监控方法采集运行时入参出参和异常信息》
字节码编程插桩这种技术常与 Javaagent 技术结合用在系统的非入侵监控中,这样就可以替代在方法中进行硬编码操作。比如,你需要监控一个方法,包括;方法信息、执行耗时、出入参数、执行链路以及异常等。那么就非常适合使用这样的技术手段进行处理。
小傅哥
2020/04/28
1.3K1
字节码编程,Javassist篇四《通过字节码插桩监控方法采集运行时入参出参和异常信息》
基于JavaAgent的全链路监控二《通过字节码增加监控执行耗时》
案例简述 通过上一章节的介绍《嗨!JavaAgent》,我们已经知道通过配置-javaagent:文件.jar后,在java程序启动时候会执行premain方法。接下来我们使用javassist字节码增强的方式,来监控方法程序的执行耗时。
小傅哥
2020/07/14
1.4K0
ASM字节码编程 | 如果你只写CRUD,那这种技术栈你永远碰不到!!!
写这篇文章的时候我在想可能大部分程序员包括你我,常常都在忙于业务开发或奔波在日常维护与修复BUG的路上,当不能从中吸取技术营养与改变现状后,就像一台恒定运行的机器,逃不出限定宇宙速度的一个圈里。可能你也会有自己的难处,平时加班太晚没有时间学习、周末家里琐事太多没有精力投入,放假计划太满没有空闲安排。总之,学习就会被搁置。而当一年年的过去后,当自己的年龄与能力不成匹配后又会后悔没有给多投入一些时间学习成长。
小傅哥
2020/03/26
2.8K0
ASM字节码编程 | 如果你只写CRUD,那这种技术栈你永远碰不到!!!
字节码编程,Javassist篇一《基于javassist的第一个案例helloworld》
在字节码编程方面有三个比较常见的框架;ASM、byte-buddy、Javassist,他们都可以对这字节码进行操作,只是操作方式和控制粒度不同。
小傅哥
2020/04/20
5760
字节码编程,Javassist篇一《基于javassist的第一个案例helloworld》
字节码编程,Javassist篇二《定义属性以及创建方法时多种入参和出参类型的使用》
在上一篇 Helloworld 中,我们初步尝试使用了 Javassist字节编程的方式,来创建我们的方法体并通过反射调用运行了结果。大致了解到创建在使用字节码编程的时候基本离不开三个核心类;ClassPool、CtClass、CtMethod,它们分别管理着对象容器、类和方法。但是我们还少用一样就是字段;CtFields,在这一章节中我们不止会使用字段,还会创建多个不同入参类型和返回值的学习。
小傅哥
2020/04/21
1.3K0
字节码编程,Javassist篇二《定义属性以及创建方法时多种入参和出参类型的使用》
ASM字节码编程 | 用字节码增强技术给所有方法加上TryCatch捕获异常并输出
Wiki:https://github.com/fuzhengwei/CodeGuide/wiki
小傅哥
2020/04/17
1.5K0
ASM字节码编程 | 用字节码增强技术给所有方法加上TryCatch捕获异常并输出
ASM字节码编程 | 用字节码增强技术给所有方法加上TryCatch捕获异常并输出!
一套系统是否稳定运行,取决于它的运行健康度,而这包括;调用量、可用率、响应时长以及服务器性能等各项指标的一个综合值。并且在系统出现异常问题时,可以抓取整个业务方法执行链路并输出;当时的入参、出参、异常信息等等。当然还包括一些JVM、Redis、Mysql的各项性能指标,以用于快速定位并解决问题。
小傅哥
2020/07/14
8141
字节码编程,Javassist篇五《使用Bytecode指令码生成含有自定义注解的类和方法》
到本章为止已经写了四篇关于字节码编程的内容,涉及了大部分的API方法。整体来说对 Javassist 已经有一个基本的使用认知。那么在 Javassist 中不仅提供了高级 API 用于创建和修改类、方法,还提供了低级 API 控制字节码指令的方式进行操作类、方法。
小傅哥
2020/04/30
1.1K0
字节码编程,Javassist篇五《使用Bytecode指令码生成含有自定义注解的类和方法》
《IntelliJ IDEA 插件开发》第八节:在插件中引入探针,基于字节码插桩获取执行SQL
一月三舟,托尔斯泰说:“多么伟大的作家,也不过就是在书写自己的片面而已”。何况是我,何况是我们!
小傅哥
2022/03/28
1.2K0
《IntelliJ IDEA 插件开发》第八节:在插件中引入探针,基于字节码插桩获取执行SQL
javaAgent通过字节码对方法增强和使用 byte-buddy 来实现类的增强
在上一篇讲述了入门和实操https://cloud.tencent.com/developer/article/2360594 本章节使用字节码和byte-buddy来玩
杨不易呀
2023/11/19
1.2K0
javaAgent通过字节码对方法增强和使用 byte-buddy 来实现类的增强
字节码增强技术,不止有 Java Proxy、 Cglib 和 Javassist 还有 Byte Buddy
提到字节码增强技术,相信用过 Spring 的小伙伴都会知道 Java Proxy 和 Cglib。
Java极客技术
2024/01/31
8060
字节码增强技术,不止有 Java Proxy、 Cglib 和 Javassist 还有 Byte Buddy
深入字节码 -- 计算方法执行时间 原
java程序通过javac编译之后生成文件.class就是字节码集合,正是有这样一种中间码(字节码),使得scala/groovy/clojure等函数语言只用实现一个编译器即可运行在JVM上。 看看一段简单代码。
九州暮云
2019/08/21
1.2K1
推荐阅读
字节码编程,Byte-buddy篇二《监控方法执行耗时动态获取出入参类型和值》
1.3K0
调研字节码插桩技术,用于系统监控设计和实现
1.1K0
基于JavaAgent的全链路监控三《ByteBuddy操作监控方法字节码》
2.1K0
字节码编程,Byte-buddy篇一《基于Byte Buddy语法创建的第一个HelloWorld》
1K0
方案设计:基于IDEA插件开发和字节码插桩技术,实现研发交付质量自动分析
10.1K0
java agent和byte-buddy组合的简单使用
9620
字节码编程,Byte-buddy篇三《使用委托实现抽象类方法并注入自定义注解信息》
7930
JavaAgent+ASM字节码插桩采集方法名称以及入参和出参结果并记录方法耗时
3.2K1
字节码编程,Javassist篇四《通过字节码插桩监控方法采集运行时入参出参和异常信息》
1.3K1
基于JavaAgent的全链路监控二《通过字节码增加监控执行耗时》
1.4K0
ASM字节码编程 | 如果你只写CRUD,那这种技术栈你永远碰不到!!!
2.8K0
字节码编程,Javassist篇一《基于javassist的第一个案例helloworld》
5760
字节码编程,Javassist篇二《定义属性以及创建方法时多种入参和出参类型的使用》
1.3K0
ASM字节码编程 | 用字节码增强技术给所有方法加上TryCatch捕获异常并输出
1.5K0
ASM字节码编程 | 用字节码增强技术给所有方法加上TryCatch捕获异常并输出!
8141
字节码编程,Javassist篇五《使用Bytecode指令码生成含有自定义注解的类和方法》
1.1K0
《IntelliJ IDEA 插件开发》第八节:在插件中引入探针,基于字节码插桩获取执行SQL
1.2K0
javaAgent通过字节码对方法增强和使用 byte-buddy 来实现类的增强
1.2K0
字节码增强技术,不止有 Java Proxy、 Cglib 和 Javassist 还有 Byte Buddy
8060
深入字节码 -- 计算方法执行时间 原
1.2K1
相关推荐
字节码编程,Byte-buddy篇二《监控方法执行耗时动态获取出入参类型和值》
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档