基于动态代理实现接口耗时计算

2023-12-19

对于动态代理模式,Java的反射机制提供了支持。

耗时计算写在主逻辑代码存在很强的耦合性,这里提供了一种解耦合的方式去实现,在Spring框架aop也用了这一技术。

登录接口:

public class UserServiceImpl implements IUserService {


    public UserServiceImpl() {

    }


    @Override
    public LoginVo login() {
        //登录操作
        String token = "123";
        try {
            Thread.sleep(new Random().nextInt(100));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("登录成功!");
        return new LoginVo(token);
    }
}

利用Proxy.newProxyInstance动态创建实现类

public class PrintUtil {

    public static Object createProxy(Object proxiedObject) {
        Class<?>[] interfaces = proxiedObject.getClass().getInterfaces();
        DynamicProxyHandler handler = new DynamicProxyHandler(proxiedObject);
        return Proxy.newProxyInstance(proxiedObject.getClass().getClassLoader(), interfaces, handler);
    }

    private static class DynamicProxyHandler implements InvocationHandler {
        private Object proxiedObject;

        public DynamicProxyHandler(Object proxiedObject) {
            this.proxiedObject = proxiedObject;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            long startTimestamp = System.currentTimeMillis();
            Object result = method.invoke(proxiedObject, args);
            long endTimeStamp = System.currentTimeMillis();
            long responseTime = endTimeStamp - startTimestamp;
            String apiName = proxiedObject.getClass().getName() + ":" + method.getName();
            System.out.println("apiName: " + apiName + "\nneedTime: " + responseTime + " ms");
            return result;
        }
    }
}

上层调用。

public class UserController {
    IUserService userService = (IUserService)PrintUtil.createProxy(new UserServiceImpl());

    public Object handle(){
        return userService.login();
    }
}

测试结果:

public class Test {
    public static void main(String[] args) {
        UserController controller = new UserController();
        final Object res = controller.handle();
    }
}


登录成功!
apiName: com.cx.learn.model.proxy.UserServiceImpl:login
needTime: 76 ms
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于动态代理实现接口耗时计算 的相关文章

  • 枚举的子类化

    有没有一种简单的方法来子类化Javaenum 我问这个问题是因为我有大约 10 个实现相同接口的对象 但它们对某些方法也有相同的实现 因此我想通过将所有相同的实现放置在扩展的中间对象中来重用代码Enum它也是我需要的所有其他类的超类 或许事
  • 非易失性领域的出版与阅读

    public class Factory private Singleton instance public Singleton getInstance Singleton res instance if res null synchron
  • Java LostFocus 和 InputVerifier,按反向制表符顺序移动

    我有一个 GUI 应用程序 它使用 InputVerifier 在产生焦点之前检查文本字段的内容 这都是很正常的 然而 昨天发现了一个问题 这似乎是一个错误 但我在任何地方都找不到任何提及它的地方 在我将其报告为错误之前 我想我应该问 我在
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • ThreeTen 向后移植与 JSR-310 的比较

    由于某些原因 我们现在无法使用 java 8 我们仍然停留在 java 7 上 不过 我想使用新的JSR 310 date time APIs现在 使用官方向后移植 ThreeTen http www threeten org threet
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • 为什么在将 String 与 null 进行比较时会出现 NullPointerException?

    我的代码在以下行中出现空指针异常 if stringVariable equals null 在此语句之前 我声明了 stringVariable 并将其设置为数据库字段 在这个声明中 我试图检测该字段是否有null值 但不幸的是它坏了 有
  • UseCompressedOops JVM 标志有什么作用以及何时应该使用它?

    HotSpot JVM 标志是什么 XX UseCompressedOops我应该做什么以及什么时候使用它 在 64 位 Java 实例上使用它 与不使用它 时 我会看到什么样的性能和内存使用差异 去年大多数 HotSpot JVM 都默认
  • 数据库中的持久日期不等于检索日期

    我有一个具有 Date 属性的简单实体类 此属性对应于 MySQL 日期时间列 Entity public class Entity Column name start date Temporal TemporalType TIMESTAM
  • Android - 存储对ApplicationContext的引用

    我有一个静态 Preferences 类 其中包含一些应用程序首选项和类似的内容 可以在那里存储对 ApplicationContext 的引用吗 我需要该引用 以便我可以在不继承 Activity 的类中获取缓存文件夹和类似内容 你使用的
  • 按降序排序映射java8 [重复]

    这个问题在这里已经有答案了 private static
  • 如何向页面添加 HTML 页眉和页脚?

    如何使用 itext 从 html 源添加标题到 pdf 目前 我们已经扩展了 PdfPageEventHelper 并重写了这些方法 工作正常 但当我到达 2 个以上页面时 它会抛出 RuntimeWorkerException Over
  • 即使禁用安全性,OAuth 令牌 API 也无法在 Elastic Search 中工作

    我是 Elastic search 新手 使用 Elastic search 版本 7 7 1 我想通过以下方式生成 OAuth 令牌弹性搜索文档 https www elastic co guide en elasticsearch re
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上
  • 检测到 JVM 正在关闭

    我有一个使用 addShutdownHook 处理 Ctrl C 的 Swing 应用程序 它工作正常 直到我的关闭任务之一调用一个在正常情况下更改 JLabel 文本的函数 此时它挂起 我认为问题是 Swing EDT 已终止或正在等待某
  • 什么是 Java2D 处理程序线程?

    我创建了一个使用 Hibernate 的示例 java 应用程序 当我进行线程转储时 我观察到一个名为 Java2D Disposer 的奇怪线程 有人能告诉我该线程的功能吗 AWT 系统中的某些实体需要最终确定以释放资源 最突出的例子是j
  • 如何让 Firebase 与 Java 后端配合使用

    首先 如果这个问题过于抽象或不适合本网站 我想表示歉意 我真的不知道还能去哪里问 目前我已经在 iOS 和 Android 上开发了应用程序 他们将所有状态保存在 Firebase 中 因此所有内容都会立即保存到 Firebase 实时数据
  • Java 的“&&”与“&”运算符

    我使用的示例来自 Java Herbert Schildt 的完整参考文献 第 12 版 Java 是 14 他给出了以下 2 个示例 如果阻止 第一个是好的 第二个是错误的 因此发表评论 public class PatternMatch
  • 在会话即将到期之前调用方法

    我的网络应用程序有登录的用户 有一个超时 在会话过期之前 我想执行一个方法来清理一些锁 我已经实现了sessionListener但一旦我到达public void sessionDestroyed HttpSessionEvent eve

随机推荐

  • HONEYWELL 05704-A-0145 四通道控制卡

    HONEYWELL 05704 A 0145 四通道控制卡 HONEYWELL 05704 A 0145 四通道控制卡 产品详情 HONEYWELL 05704 A 0145 控制卡通常用于监测和控制系统中的信号或参数 四通道控制卡可能意味
  • 【flink番外篇】5、flink的window(介绍、分类、函数及Tumbling、Sliding、session窗口应用)介绍及示例(1)- 窗口介绍、分类、函数

    Flink 系列文章 一 Flink 专栏 Flink 专栏 系统介绍某一知识点 并辅以具体的示例进行说明 1 Flink 部署系列 本部分介绍Flink的部署 配置相关基础内容 2 Flink基础系列 本部分介绍Flink 的基础部分 比
  • HONEYWELL 05704-A-0121 船舶控制器模块

    HONEYWELL 05704 A 0121 船舶控制器模块 HONEYWELL 05704 A 0121 船舶控制器模块产品详情 船舶控制器模块通常用于船舶系统中 以实现对船舶的监测 控制和操作 这些模块可能包括各种传感器 执行器和控制逻
  • OpenCL™规范 3.2.3设备侧队列

    3 2 3 Device side enqueue 3 2 3设备侧队列 Device side enqueue is missing before version 2 0 2 0版本之前缺少设备端队列 Algorithms may nee
  • 实现基于 Keepalived 和 Nginx 的高可用架构

    目录 前言 1 高可用性简介 2 准备服务器和软件 3 高可用的配置 主从配置 3 1 配置 etc keepalived keepalived conf文件 3 2 配置 usr local src nginx check sh脚本文件
  • FORCE CPCI-680编码器模块

    FORCE CPCI 680编码器模块 FORCE CPCI 680编码器模块产品详情 编码器模块通常用于测量和转换旋转或线性运动到电信号 以便用于位置测量或运动控制应用 关于FORCE CPCI 680编码器模块的具体运营领域将取决于该模
  • 武汉小程序开发市场分析:未来3年预计将增长200%

    作为中国颇具活力的城市之一 武汉在科技创新和数字经济领域迅速崛起 近年来 随着移动互联网用户规模的扩大 武汉小程序开发市场蓬勃发展 越来越多的企业与个人开始关注和投入这一领域 武汉小程序开发市场具有以下几个显著的优势 1 科技创新环境助力
  • 查理.芒格:超出能力圈的能力不叫能力

    如果你确有能力 你就会非常清楚你能力圈的边界在哪里 没有边界的能力根本不能称之为能力 如果你问自己是否过了能力圈的范围 那这个问题本身就是答案 查理 芒格 很多人会认为优秀的人做什么都是优秀的 很容易形成个人崇拜 甚至是盲从 所以当我们在讨
  • Android-Binder基本原理

    一 进程角度看IPC机制 在Android系统中 每个进程只能运行在自己所拥有的虚拟地址空间 例如 一个4GB的虚拟地址空间 包含3GB的用户空间和1GB的内核空间 内核空间的大小可以通过参数配置进行调整 两个进程之间的用户空间是彼此独立的
  • 使用selenium执行组合快捷键ctrl+v不生效问题

    使用selenium进行自动化测试 依次使用快捷键ctrl a ctrl c ctrl v对文本进行复制粘贴 发现前两步执行都是没有问题的 但是执行粘贴时 始终无法将文本粘贴到文本区 焦点时已经获取的 经过反复测试 网上查阅资料 发现在执行
  • 运维人员必须知道的10个系统进程

    前言 在日常运维工作中 经常会看到一些奇怪的系统进程占用资源比较高 但是又不敢随意的Kill这些进程 而这些系统级的内核进程都是会用中括号括起来的 它们会执行一些系统的辅助功能 如将缓存写入磁盘 无括号的进程都是用户们执行的进程 如java
  • python输入位置的坐标(即经纬度),计算两点的距离结果保留两位

    1 可以使用haversine公式 from math import radians sin cos sqrt atan2 def distance lat1 lon1 lat2 lon2 将经纬度转换为弧度 lon1 radians lo
  • Caught exception in launch(see debug for traceback)

    Caught exception in launch see debug for traceback Caught exception when trying to load file of format xml Caught except
  • 【Kotlin】集合操作

    Kotlin 集合操作篇 背景 集合类型 集合操作 加减操作 并集 交集 集合分组
  • 网络安全(黑客)自学秘籍

    想自学网络安全 黑客技术 首先你得了解什么是网络安全 什么是黑客 网络安全可以基于攻击和防御视角来分类 我们经常听到的 红队 渗透测试 等就是研究攻击技术 而 蓝队 安全运营 安全运维 则研究防御技术 无论网络 Web 移动 桌面 云等哪个
  • layui表格table不分页,显示全部数据

    layui表格table不分页 显示全部数据 表格渲染时添加两行代码 page false limit Number MAX VALUE 数据表格默认全部显示 table render elem orderTable id orderTab
  • 【论文阅读笔记】BTS-ST: Swin transformer network for segmentation and classification of multimodality breast

    Iqbal A Sharif M BTS ST Swin transformer network for segmentation and classification of multimodality breast cancer imag
  • C/C++编程中的算法实现技巧与案例分析

    C C 编程语言因其高效 灵活和底层的特性 被广大开发者用于实现各种复杂算法 本文将通过10个具体的算法案例 详细探讨C C 在算法实现中的技巧和应用 一 冒泡排序 Bubble Sort 冒泡排序 Bubble Sort 是一种简单的排序
  • Vue学习之watch侦听器:案例实现翻译功能

    watch侦听器 作用 监视数据的变化 当数据发生变化时 执行一些业务逻辑或者是异步操作 执行的场景例如在线翻译 当文本区域的内容发生变化时 会发生翻译内容的同时更新 语法 简单的写法 简单数据类型 可以直接的进行监听 完整的写法 添加额外
  • 基于动态代理实现接口耗时计算

    对于动态代理模式 Java的反射机制提供了支持 耗时计算写在主逻辑代码存在很强的耦合性 这里提供了一种解耦合的方式去实现 在Spring框架aop也用了这一技术 登录接口 public class UserServiceImpl imple