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

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(使用前将#替换为@)

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

  • 在Windows Server 2003下如何在本地系统帐户下运行jvisualvm.exe?

    我在带有 Java 1 6 u 20 的 Windows Server 2003 下将 GlassFish 3 0 1 作为 Windows 服务运行 总体上我很满意 我希望能够在这个 JVM 上使用 VisualVM 并使用无法在 Tom
  • 非易失性领域的出版与阅读

    public class Factory private Singleton instance public Singleton getInstance Singleton res instance if res null synchron
  • 在不支持 CAS 操作的处理器上进行 CompareAndSet

    今天 我在一次采访中被问到下一个问题 如果您在具有不支持 CAS 操作的处理器的机器上调用 AtomicLong 的compareAndSet 方法 会发生什么情况 您能否帮我解决这个问题 并在可能的情况下提供一些全面描述的链接 From
  • Kafka - 如何同时使用过滤器和过滤器?

    我有一个 Kafka 流 它从一个主题获取数据 并且需要将该信息过滤到两个不同的主题 KStream
  • 使用 Exec Maven 插件分叉 Java,而不使用“exec”目标

    来自文档 https www mojohaus org exec maven plugin exec exec在单独的进程中执行程序和Java程序 exec java在同一虚拟机中执行 Java 程序 我想 fork 一个 java 程序
  • 查看Java Agent修改的Java类的源代码

    我需要了解 Java 代理如何修改我的初始类 以便我能够理解代码的作用 build gradle configurations jar archiveName agent2 jar jar manifest attributes Prema
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • Java AES 256 加密

    我有下面的 java 代码来加密使用 64 个字符密钥的字符串 我的问题是这会是 AES 256 加密吗 String keyString C0BAE23DF8B51807B3E17D21925FADF273A70181E1D81B8EDE
  • 如何使用双重调度来分析图形基元的交集?

    我正在分析图形基元 矩形 直线 圆形等 的交互并计算重叠 相对方向 合并等 这被引用为双重调度的一个主要示例 例如维基百科 http en wikipedia org wiki Double dispatch 自适应碰撞算法通常要求 不同的
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • 如何自定义舍入形式

    我的问题可能看起来很简单 但仍然无法得到有效的东西 我需要自定义 Math round 舍入格式或其他格式以使其工作如下 如果数字是 1 6 他应该四舍五入到 1 如果大于或等于 1 7 他应该四舍五入到 2 0 对于所有其他带有 6 的小
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • 如何使用 Jersey 将嵌套列表封送为 JSON?我得到一个空数组或一个包含数组的单元素字典数组

    我正在开发一个使用 Jersey 将对象转换为 JSON 的项目 我希望能够写出嵌套列表 如下所示 data one two three a b c 我想要转换的对象首先将数据表示为 gt gt 我认为 Jersey 会做正确的事情 以上输
  • Lombok 不适用于 Eclipse Neon

    我下载了lombok jar lombok 1 16 14 jar 并将其放入我的下载中 然后我点击这个 jar 执行正确地识别了我的 MacOS 上的 Eclipse 实例 然后我选择了我想要的实例 Lombok也在pom xml中指定
  • 用于请求带有临时缓存的远程 Observable 的 RxJava 模式

    用例是这样的 我想暂时缓存最新发出的昂贵的Observable响应 但在它过期后 返回到昂贵的源Observable并再次缓存它 等等 一个非常基本的网络缓存场景 但我真的很难让它工作 private Observable
  • Spring Data Rest 多对多 POST

    首先 让我解释一下我的用例 这非常简单 有一个用户实体和一个服务实体 我使用 UserService 作为连接实体 连接表 在用户和服务之间建立多对多关联最初 会有一些用户集和一些服务集 用户可以在任何时间点订阅任何服务 在这种情况下 将向
  • 检测到 JVM 正在关闭

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

    我使用的示例来自 Java Herbert Schildt 的完整参考文献 第 12 版 Java 是 14 他给出了以下 2 个示例 如果阻止 第一个是好的 第二个是错误的 因此发表评论 public class PatternMatch
  • Spring 作为 JNDI 提供者?

    我想使用 Spring 作为 JNDI 提供程序 这意味着我想在 Spring 上下文中配置一个 bean 可以通过 JNDI 访问该 bean 这看起来像这样
  • GAE 无法部署到 App Engine

    我正在尝试从 Eclipse 发布 Web 应用程序 我在 GAE 上创建了四个项目 可以通过登录我的帐户并查看控制台来查看它们 我已经改变了appengine web xml到项目的应用程序 ID 如果我将其更改为 GAE 上第一个创建的

随机推荐

  • 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