动态代理—Java

news2024/9/21 11:16:24

代理可以理解为请一个中间人帮忙处理一些事情。

代理支持任意接口类型的实现类对象做代理,也可以直接为接本身做代理。

可以为被代理对象的所有方法做代理。

可以在不改变方法源码的情况下,实现对方法功能的增强。

简化了编程工作、提高了软件系统的可扩展性,也提高了开发效率。

关键:必须有接口,实现类要实现接口(代理通常是基于接口实现的)。创建一个实现类的对象,该对象为业务对象。为业务对象做一个代理对象。

代理的一个案例快速理解

需求:

业务功能的性能统计:某企业用户管理业务,需包含用户登录,用户删除,用户查询功能,并要统计每个功能的耗时。

分析:

  1. 定义一个UserService表示用户业务接口,规定必须完成用户登录,用户删除,用户查询功能。

  1. 定义一个实现类UserServiceE实现UserService,并完成相关功能,且统计每个功能的耗时。

  1. 定义测试类,创建实现类对象,调用方法。

实现:

1.业务接口:

public interface UserService {
    public String login(String name,String psd);
    public void deleteUser();
    public String selectUser();

}

2.实现类

这里为了模拟方便,每个业务方法只是用sleep延时。

public class UserServiceE implements UserService {
    @Override
    public String login(String name,String psd) {
        String rs="密码错误!";
        if("admin".equals(name)&&"123456".equals(psd))
            rs="密码正确";
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return rs;
    }
    @Override
    public void deleteUser() {
        System.out.println("删除用户~");
        try {
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    @Override
    public String selectUser() {
        System.out.println("查询用户~");
        try {
            Thread.sleep(2500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "查询了用户~";
    }
}

3.代理类

代理类里面需要传入实现类的对象,在里面就用到了反射的一些知识。

  1. 写好一个接口类型的静态方法,直接写return返回代理 Proxy

  1. 方法newProxyInstance

  1. 对于newProxyInstance有三个参数:接口InvocationHandler

  1. 实现InvocationHandler

  1. 在invoke里面运行目标方法,invoke反射。

public class proxyUtil {
    public static UserService getProxy(UserService obj){
        return (UserService) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        long startTime=System.currentTimeMillis();

                        Object rs = method.invoke(obj,args);

                        long endTime=System.currentTimeMillis();
                        System.out.println(method.getName()+" 耗时:"+(endTime-startTime)/1000.0+"秒。");
                        return rs;
                    }
                });
    }
}

4.main方法

使用动态代理后,就不用再在各个方法中进行修改代码来统计了,而且可扩展性更好。如果对代理类实现泛型,就更加通用了。

    public static void main(String[] args) {
        UserService u= proxyUtil.getProxy( new UserServiceE());

        System.out.println(u.login("admin", "123456"));
        u.deleteUser();
        System.out.println(u.selectUser());
    }

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

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

相关文章

QT入门Display Widgets之QLine、QLcdNumber、QTextBrowser

目录 一、QLine界面相关 1、布局介绍 2、界面基本属性 二、QLCDNumber的介绍 1、界面布局 2、定时器代码测试 三、QTextBrowser 此文为作者原创,创作不易,转载请标明出处! 一、QLine界面相关 1、布局介绍 先看下界面中创建个Q…

递归(java)

1.递归应用场景 看个实际应用场景,迷宫问题(回溯), 递归(Recursion) 2.递归的概念 简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。 3.递归调用机制 我列举两个小案例,来帮助大家…

Stream——数字类型的字符串排序

文章目录前言什么是数字类型的字符串一个简单的坑demo拯救坑代码对象集合中的数字类型排序(有坑)对象集合中的数字类型排序 解决扩展将数字类型字符串数组转换为Integer集合总结前言 想到给数据进行排序,一开始头脑中想到的就是sorted(),本篇文章重点说…

SSL安全证书有什么优缺点?

在将SSL实施到您的站点之前,了解SSL的优点和缺点非常重要。下面就给大家分析下安装SSL证书有什么优缺点:优点:1. 加密信息确保您在线发送的数据只被指定的接收者读取,而不被其他人读取。SSL对原始数据进行了一些更改,因…

秒懂SpringBoot之Filter与HandlerInterceptor异同

[版权申明] 非商业目的注明出处可自由转载 出自:shusheng007 文章目录概述前置知识Filter原理及使用场景使用执行顺序设置Filter作用范围HandlerInterceptor原理及使用场景使用实现org.springframework.web.servlet.HandlerInterceptor 接口配置二者异同共同点不同点…

RocketMQ 高级特性

1,事务消息代码实现 之前我们已经在讨论订单业务消息丢失问题中引出了事务消息,本内容我们就实际用代码来实现一下事务消息吧。 首先我们用原生代码来实现一下事务消息,下面是事务消息生产者TransactionProducer类的代码,具体代码…

基于LinkedList高性能android列表适配器

1、前言 我们大部分的时候都是使用ArrayList作为Android适配器Adapter(无论是ListView或者RecyclerView)下的数据容器。为什么使用ArrayList呢?因为他的内部是由数组实现的,所以访问数组元素速度最快,但是如果数据变化…

JNI内两种方式从C/C++中传递一维、二维、三维数组数据至Java层详细梳理

目录 0 前言 1 准备工作介绍 2 一维数组 2.1 return形式 2.2 参数形式 3 二维数组 3.1 return形式 3.2 参数形式 4 三维数组 4.1 return形式 4.2 参数形式 5 测试代码 6 结果说明 0 前言 就如之前我写过的一篇文章【JNI内形参从C代码中获取返回值并返回到Java层使…

Elsevier上传LaTeX 修改稿踩坑

背景 千辛万苦修改完论文,结果发现要求上传可编辑文件,tex上传真的太难了,一堆坑,尤其是编译错误,要等系统创建pdf后才能找到。中间还打了北京的客服电话,结果他们那边并不懂相关的东西。说latex是第三方公…

C语言-基础了解-22-C文件读写

C文件读写 一、打开文件 可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE 包含了所有用来控制流的必要的信息。下面是这个函数调用的原型: FILE *fopen( const char *fil…

JS中undefined和null的区别

● JavaScript 真是一个特殊的语言, 其他语言都只有一个表示 “无” 的值, 比如 Java 语言用的是 null, C 语言用的是 NULL, Python 语言用的是 None, Ruby 语言用的是 nil. 只有 JS 里面表示 “空” 的有两个, 一个是 undefined, 一个是 null ● 很多小朋友在刚开始学习的时候…

【项目设计】高并发内存池(六)[细节优化+测试]

🎇C学习历程:入门 博客主页:一起去看日落吗持续分享博主的C学习历程博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记&…

[ 网络 ] 应用层协议 —— HTTP协议

目录 1.HTTP协议 1.1URL urlencode和urldecode 2. HTTP协议格式 HTTP请求 HTTP响应 3.告知服务器意图的HTTP方法 GET:获取资源 POST:传输实体主体 GET和POST的区别 使用Cookie的状态管理 4.返回结果的HTTP状态码 状态码告知从服务器端返回的…

十连胜!实在智能×浙江省十家农商行,数字科技赋能普惠金融

近日,中共中央、国务院印发了《数字中国建设整体布局规划》(以下简称《规划》)。《规划》指出,建设数字中国是数字时代推进中国式现代化的重要引擎,是构筑国家竞争新优势的有力支撑。全面提升数字中国建设的整体性、系…

C语言-基础了解-23-C预处理器

C预处理器 一、C预处理器 C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把 C 预处理器(C Prepr…

spring-security2

参考b站up主:传送门 前沿 : 回顾上章:最顶层就是一个过滤器 SpringSecurity流程:FilterChainProxy->根据请求决定一个 SecurityFilterChain (挨个调用其matches方法 匹配请求能否处理)-> 执行SecurityFilterChain中的一系列…

Java简单认识泛型——图文详解

写在开头:想必大家和博主一样,在以往学习JavaSE的语法中,遇到了一个陌生的词——泛型,博主当时很好奇,什么是泛型呢?即使是学完了JavaSE,这个问题都没有解决,只能在百度查阅了解关于泛型的一些皮…

Maven依赖的基本概念

目录 1.依赖的基本配置 2.依赖范围 3.传递性依赖 1.依赖的基本配置 根元素project下的dependencies可以包含多个 dependence元素,以声明多个依赖。每个依赖都应该包含以下元素: 1. groupId, artifactId, version : 依赖的基本坐标, 对于任…

【C和C++】输出100内能够被13整除的数,取模判断方法

目录 前言基础概念重温整除例子小知识点收尾前言 在软件行业已经有快十年,技术虽然一般般,但是足够应付和解决编程入门的相关问题! 都说十年磨一剑,积累到一定经验,是时候发挥自己的价值,给予入门的同行些许的帮助! 为什么要写收费专栏,其实原因很简单,时间就是金钱(…

聚观早报 |拼多多跨境电商业务正式登陆澳洲;中国加快6G网络研发

今日要闻:拼多多跨境电商业务正式登陆澳洲;全球自动驾驶公司排名特斯拉垫底;中国将加快 6G 网络研发;B站再次“崩”上热搜!已闪电修复;微软将必应AI聊天每次对话上限增加至8条拼多多跨境电商业务正式登陆澳…