字节码编程javassist之打印方法耗时和入参

news2024/11/13 15:59:44

写在前面

本文看下如何实现打印方法耗时和入参。

1:程序

  • 需要增强的类:
public class ApiTest1 {

    public Integer strToInt(String str01, String str02) {
        return Integer.parseInt(str01);
    }

}
  • 插桩类
package com.dahuyou.javassist.huohuo.aa;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;

import java.lang.reflect.Method;

public class MyDoIt extends ClassLoader {
    public static void main(String[] args) throws Exception {
        ClassPool pool = ClassPool.getDefault();
        // 获取类和方法
        CtClass ctClass = pool.get(ApiTest1.class.getName());
        ctClass.replaceClassName("ApiTest1", "ApiTest12");
        String clazzName = ctClass.getName();
        CtMethod ctMethod = ctClass.getDeclaredMethod("strToInt");

        // 定义局部变量 注意必须声明,而不能直接在代码中写int xx = 222;这种,否则会报CannotCompileException: [source error] no such field: xxx
        ctMethod.addLocalVariable("startTime", CtClass.longType);
        ctMethod.addLocalVariable("incomingParameters", pool.get(Object[].class.getName()));

        // 方法前加强
//        ctMethod.insertBefore("{ startTime = System.nanoTime(); incomingParameters = new Object[]{$1, $2}; }");
        ctMethod.insertBefore("{ startTime = System.nanoTime(); incomingParameters = new Object[2]; incomingParameters[0] = $1; incomingParameters[1] = $2; }");

        // 方法后加强,输出耗时和参数
        ctMethod.insertAfter("System.out.println(\"执行耗时:\" + (System.nanoTime() - startTime));");


        // 测试调用
        byte[] bytes = ctClass.toBytecode();
        Class<?> clazzNew = new MyDoIt().defineClass("com.dahuyou.javassist.huohuo.aa.ApiTest1", bytes, 0, bytes.length);

        // 反射运行测试
        Class aClass = clazzNew;
        Object obj = aClass.newInstance();
        Method main = aClass.getDeclaredMethod("strToInt", String.class, String.class);
        main.invoke(obj, "99", "87");

//        System.out.println("执行耗时:" + (System.nanoTime() - startTime));
        ctClass.writeFile();


    }
}

insertBefore和insertAfter分别用来在方法的开始和结束插入代码。

运行:

执行耗时:48000

Process finished with exit code 0
  • 查看生成的字节码
    在这里插入图片描述

写在后面

参考文章列表

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

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

相关文章

【数据结构】线性表----栈详解

栈 栈&#xff08;Stack&#xff09;是一种常见的数据结构&#xff0c;它具有**后进先出&#xff08;Last In, First Out, LIFO&#xff09;**的特点。栈的运作类似于物理世界中的叠盘子&#xff1a;最新放上去的盘子最先被拿走&#xff0c;而最底部的盘子最后才能被取出。 如…

C语言学习记录Day2

for循环 for&#xff08;表达式1&#xff1b;表达式2&#xff1b;表达式3&#xff09; 循环语句&#xff1b; 注&#xff1a;表达式1&#xff1a;初始化部分.表达式2&#xff1a;条件判断部分 表达式3&#xff1a;调整部分 不可再for循环体内修改循环变量&#xff0c;防止f…

【5G VoNR】VoNR流程简述

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

支持向量机 (support vector machine,SVM)

支持向量机 &#xff08;support vector machine&#xff0c;SVM&#xff09; flyfish 支持向量机是一种用于分类和回归的机器学习模型。在分类任务中&#xff0c;SVM试图找到一个最佳的分隔超平面&#xff0c;使得不同类别的数据点在空间中被尽可能宽的间隔分开。 超平面方…

const 修饰不同内容区分

1.修饰局部变量 const int a 1;int const a 1; 这两种是一样的 注意&#xff1a; const int b; 该情况下编译器会报错&#xff1a;常量变量"b”需要初始值设定项 将一个变量没有赋初始值直接const修饰后&#xff0c;在以后时无法更改内容的。 2.修饰常量字符串 a.…

Python前沿技术:机器学习与人工智能

Python前沿技术&#xff1a;机器学习与人工智能 一、引言 随着科技的飞速发展&#xff0c;机器学习和人工智能&#xff08;AI&#xff09;已经成为了计算机科学领域的热门话题。Python作为一门易学易用且功能强大的编程语言&#xff0c;已经成为了这两个领域的首选语言之一。本…

U盘管理软件有哪些?3款好用的软件亲测有效!

在数字化办公与数据交换日益频繁的今天&#xff0c;U盘作为便携的存储设备&#xff0c;其重要性不言而喻。 然而&#xff0c;U盘的使用也带来了数据泄露、病毒感染等安全隐患。为了有效管理U盘&#xff0c;确保数据安全与合规性&#xff0c;市场上涌现出了众多U盘管理软件。 小…

电脑选购全解析!你需要知道的一切!

在选择电脑类型时&#xff0c;你可以考虑以下因素&#xff1a; 你的主要用途是什么&#xff1f; 你是否需要携带电脑&#xff1f; 你的预算是多少&#xff1f; 你对性能和图形要求有多高&#xff1f; 你是否需要特定的软硬件功能&#xff1f;根据这些因素&#xff0c;你可以…

生成式人工智能:开发者的得力助手还是职业威胁?

在过去的几年里&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;在软件开发领域引发了广泛关注。AI工具在代码生成、错误检测、自动化测试等方面的应用&#xff0c;正在迅速改变开发者的工作方式。AI究竟是在帮助开发者提高效率&#xff0c;还是在逐渐取代他们&#xf…

预提待摊费用处理费时费力?这样做更高效!

一笔费用发生之后&#xff0c;发票取得时间、资金支付时间、费用所属时间都可能不一致&#xff0c;在权责记账规则下&#xff0c;“预提”、“待摊”的账务处理方法成为企业财务业务处理的常用手段。相应地&#xff0c;预提和摊销业务在企业极为常见&#xff0c;仅针对企业规模…

Android network - NUD检测机制(Android 14)

Android network - NUD检测机制 1. 前言2. 源码分析2.1 ClientModeImpl2.2 IpClient2.3 IpReachabilityMonitor 1. 前言 在Android系统中&#xff0c;NUD&#xff08;Neighbor Unreachable Detection&#xff09;指的是网络中的邻居不可达检测机制&#xff0c;它用于检测设备是…

雅特力AT32F423开启FPU跟不开启FPU性能差异

在大多数Cortex-M的处理器中调试端口包含一个32位的自由运行计数器&#xff0c;它可以计算 CPU 的时钟周期。计数器是 Debug 观察和跟踪(DWT)模块的一部分&#xff0c;可以很容易地用于测量代码的执行时间。下面的代码是启用和初始化这个特性非常有用。 注意测试需要重新断电上…

浅谈信息技术高效课堂管理:策略、技巧与实践

引言&#xff1a; 在信息化教育的浪潮中&#xff0c;信息技术课程正逐渐成为学校教育体系中的重要组成部分。然而&#xff0c;信息技术课堂的特殊性——高互动性、高度依赖电子设备&#xff0c;给课堂管理带来了前所未有的挑战。如何在保证教学效率的同时&#xff0c;维护良好…

钡铼技术低成本解决方案:注塑机OPC UA接入的智慧选择

在工业4.0与“中国制造2025”战略的引领下&#xff0c;传统注塑机行业正面临前所未有的转型升级挑战。为了在这场技术革新浪潮中保持竞争力&#xff0c;积极接纳并实施OPC UA标准已成为必然趋势。那么&#xff0c;对于传统注塑机而言&#xff0c;如何平滑过渡实现对OPC UA的支持…

C++入门(C语言过渡)

文章目录 前言一、C关键字二、命名空间三、C输入&输出四、缺省参数五、函数重载六、引用七、inline八、nullptr总结 前言 C是一种通用的、高级的、静态类型的编程语言&#xff0c;它在20世纪80年代由丹尼斯里奇创建的C语言基础上发展而来。以下是C发展的一些重要里程碑。 1…

Linux 常见命令使用(超详细版)

文章目录 基本echo关机、重启命令上传下载工具rz/sz<、>、>>ls管道clearcdpwd 文件处理类命令mkdirrmdirtouchcpmv 文件查看类命令catmorelessheadtail 用户管理命令useraddpasswdusermoduserdelgroupaddgroupdel 文件属性类命令chmodchownchgrpln 文件压缩类命令t…

【免费数字孪生平台】零代码制作智慧农业蔬菜大棚可视化

一&#xff0e;智慧农业的价值 智慧农业&#xff0c;作为农业中的智慧经济形态&#xff0c;是现代科学技术与农业种植深度融合的产物。它通过将物联网、云计算、大数据、人工智能等现代信息技术集成应用于农业生产中&#xff0c;实现了农业生产的无人化、自动化和智能化管理。…

C语言下的文件详解

主要内容 文件概述文件指针文件的打开与关闭文件的读写 文件 把输入和输出的数据以文件的形式保存在计算机的外存储器上&#xff0c;可以确保数据能随时使用&#xff0c;避免反复输入和读取数据 文件概述 文件是指一组相关数据的有序集合 文件是存储数据的基本单位&#…

刘永先独家访谈:揭秘格行随身WiFi万店战略背后的“难而正确”之路

在随身WiFi市场鱼龙混杂、乱象频出的背景下&#xff0c;格行随身WiFi却毅然选择了一条少有人走的路——大规模布局线下门店。近日&#xff0c;每日财经新闻的记者有幸专访了格行随身WiFi的创始人刘永先&#xff0c;深入探讨了这一战略决策背后的考量与坚持。&#xff08;文章转…

DearLicy主题 | 小众化小清新风格的博客主题源码 | Typecho主题模版

DearLicy主题&#xff0c;一款小众化小清新风格的博客主题 主题支持Typecho所支持的所有版本PHP 简约、小众、优雅 安装教程 1.将主题上传至/usr/themes/文件夹下解压 2.后台进行启用 3.访问前台查看效果 图片&#xff1a;