使用javassist 无侵入实现方法时间统计

本文介绍了如何使用javassist这个字节码操作库,无侵入地统计Java方法的执行时间。通过修改类的字节码,添加时间统计逻辑,并讨论了类加载器与字节码修改的关系,以及如何在运行时启用javaagent实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用javassist 无侵入实现方法时间统计

在JAVA 语言中 我们知道最终JVM执行的是字节码文件,那么 改变字节码指令 其实就是修改了代码执行逻辑.
今天我们就来介绍下 java中操作字节码的工具 javasst


javassist

一种简单易用操作字节码的工具类 —— [ 官方网站 ]

修改类中的实例方法

public class Student {

    private int age;

    private String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String toString(){
        return "student";
    }

}

通过javap 查看下 生成的字节码

javap -v Student
 public java.lang.String toString();
    descriptor: ()Ljava/lang/String;
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: ldc           #31                 // String student
         2: areturn
      LineNumberTable:
        line 26: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       3     0  this   Lsun/cn/demo/Student;

通过javassist api修改toString 方法

public class StudentByteCode {
   

    public void modifyByteCodeMethod() throws Exception {
        ClassPool pool = ClassPool.getDefault();
        /** 获取类信息  */
        CtClass cls = pool.get(Student.class.getCanonicalName());
        /** 获取方法描述信息 */
        CtMethod toStringMethod = cls.getDeclaredMethod("toString");
        toStringMethod.insertBefore("System.out.println(\"toString before\");");
        toStringMethod.insertAfter("System.out.println(\"toString after\");");
        cls.writeFile(Student.class.getResource("../../../").getPath());
    }

    public static void main(String[] args) throws Exception {
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值