jdk动态代理详解(通俗易懂,5分钟带你快速理解动态代理)全网最简
相信很多小伙伴都不理解动态代理,
它是怎么代理的?怎么用?听了很多课程还是不会
我这次用最简单通俗易懂的代码来解释jdk动态代理,希望各位小伙伴能听懂,喜欢就点个赞在走吧!
活不多说,直接上代码.
第一种: 最简代码(需要会lambda,反射知识才能看懂)
public static void main(String[] args) { //主方法ClacInterface myClac = new MyClac(); //被代理的对象//生成了一个代理类对象proxyBeanClacInterface proxyBean = (ClacInterface)Proxy.newProxyInstance(//第一个参数被代理类的类加载器myClac.getClass().getClassLoader(), //第二个参数myClac的所以实现接口myClac.getClass().getInterfaces(),//第三参数是InvocationHandler 这里是lambda简化的匿名内部类写法(a, b, c) -> {System.out.println("我代理了myClac对象");return b.invoke(myClac, c);} );System.out.println("proxyBean.add(1, 3) = " + proxyBean.add(1, 3));}
输出结果:
接口
public interface ClacInterface {int add(int a ,int b );
}
实现类
public class MyClac implements ClacInterface{@Overridepublic int add(int a, int b) {System.out.println("a+b"+"="+(a+b));return a+b;}
}
使用动态代理的目的: 增强代理对象的方法
上面的代码就实现了动态代理, 通过jdkProxy类生成了一个proxyBean(这个对象就是代理对象)
然后执行了被代理对象MyClac中的方法.
这也就是动态代理,运行时生成了一个代理对象!
哈哈,可能很多小伙伴看到这是一脸懵逼,我把上面代码都详细解释和改造成第二版
第二版(详细解释每一步具体意思)
public static void main(String[] args) {//创建接口的实现类对象,也就是被代理对象ClacInterface myClac = new MyClac();//获取被代理实现类对象的Class对象Class<? extends ClacInterface> clazz = myClac.getClass();//第一个参数,被代理对象的类加载器ClassLoader classLoader = clazz.getClassLoader();//第二个参数,被代理对象实现的所有接口数组Class<?>[] interfaces = clazz.getInterfaces();//通过调用Proxy.newProxyInstance的方法来创建一个代理类对象来代理myClac对象ClacInterface proxyBean = (ClacInterface)Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {//第三个参数InvocationHandler的实现类,这里用了匿名内部类的方式@Override//重写InvocationHandler的invoke方法,他有三个参数可以供我们使用public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//第一个参数proxy 可以通过proxy.getClass().getClassName() 来查看对象,是一个匿名的Proxy的代理类System.out.println("proxy.getClass().getName() = " + proxy.getClass().getName());System.out.println("前置增强------");//第二个参数method 也就是被代理对象myClac对象的方法,可以通过method调用myClac的方法//第三个参数args 也就是MyClac方法执行时传入的实际参数//method.invoke的返回值就是myClac方法的返回值Object invoke = method.invoke(myClac, args);System.out.println("后置增强------");return invoke;}});System.out.println("proxyBean.add(1, 3) = " + proxyBean.add(1, 3));}
输出结果
到这里,我觉得很多小伙伴可能已经理解了动态代理代码怎么实现,也有可能是一脸懵,所以我在文末总结了下jdk动态代理:
java反射包中的Proxy类可以调用newProxyInstance创建一个代理类对象.
传入三个参数,
一个是代理类的类加载器,
一个是实现的所有接口数组,
一个调用处理器的实现类.
创建好了代理对象,代理对象就可以执行被代理类实现的接口的方法,在执行方法时,会先去执行调用处理器实现类中的invoke方法,invoke方法就可以对被代理类进行功能增强.
希望本文能对你有帮助.喜欢的话留下点赞关注在走吧~~
jdk动态代理详解(通俗易懂,5分钟带你快速理解动态代理)全网最简相关推荐
- Java集合核心详解【十分钟带你了解整个集合体系】
前言: 集合是Java中非常重要的一章,学习难度也相对较大,不会很快就能掌握,这里我们先对集合框架有一个大概的了解,记住其中的基础知识,后面深入研究某一个集合时,才能更好的掌握. 文章目录 一.集合介 ...
- 千文详解:十分钟带你深入了解华为交换机的通信原理
##前言 今天给大家讲解一下关于华为交换机的一些知识内容,如果是打算从事工作的朋友,走过路过别错过了~ ####交换机 交换机是当今以太网中最常见的存储转发设备,工作在数据链路层,通过读取数据包中的M ...
- Raft 协议原理详解,10 分钟带你掌握
之前写了一篇文章<肝了一个月的ETCD,从Raft原理到实践>,干货真的很多,但是无人转载,同事说文章太长了,不方便阅读.那这篇文章,我只选取里面的 Raft 协议,精华提炼,可读性更强! ...
- Android 动态分区详解(一) 5 张图让你搞懂动态分区原理
文章目录 0. 导读 1. 动态分区详解的背景 1.1 背景 1.2 动态分区的本质 2. Linux device mapper 驱动 3. Android 动态分区布局 3.1 动态分区布局 3. ...
- JAVA动态代理详解
JAVA动态代理详解 问题 1:什么是静态代理,动态代理? 2:动态代理的好处? 什么是静态代理 以生活中例子来看,我作为某某品牌面膜的北京区代理,我替厂家卖面膜,我属于代理,厂家属于委托方. 联系到 ...
- 静态代理,动态代理,Cglib代理详解
一.静态代理 新建一个接口 定义一个玩家方法: package com."".proxy.staticc;public interface Iplayer { public voi ...
- Pause/Resume Instance 操作详解 - 每天5分钟玩转 OpenStack(34)
Pause/Resume Instance 操作详解 - 每天5分钟玩转 OpenStack(34) 本节通过日志详细分析 Nova Pause/Resume 操作. 有时需要短时间暂停 instan ...
- Cinder 组件详解 - 每天5分钟玩转 OpenStack(47)
Cinder 组件详解 - 每天5分钟玩转 OpenStack(47) 本节我们将详细讲解 Cinder 的各个子服务. cinder-api cinder-api 是整个 Cinder 组件的门户, ...
- python动态类型的坑_python进阶教程之动态类型详解
动态类型(dynamic typing)是Python另一个重要的核心概念.我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值.这些都与动态类型的概念 ...
- Android 动态分区详解(六) 动态分区的底层机制
文章目录 1. Android 动态分区的两重含义 2. device mapper 的原理 3. linear 映射的原理 3.1 多个设备映射示例 3.2 `dmsetup create` 命令参 ...
最新文章
- webpack基础概念
- MySQL 之全文索引
- Gitlab+Gerrit+Ldap+nginx+mysql 之Gerrit搭建与配置(一)
- 用Java创建MongoDB上限集合
- 程序员怎么看待C语言?最伟大?最落后?
- TLS1.1升级到TLS1.2(微信小程序要求TLS1.2以上)
- php sqlsrv 分页,sqlsrv php分页
- phtread条件变量pthread_cond_t初始化方式
- WinForm实现SQLServer存储图片
- CSDN博客喜遇中兴老同事
- 如何使用速问速答求解一元二次方程
- SAN(存储区域网络),WWN, WWPN,WWNN区别
- html5辅助,Disable HTML5 Autoplay
- xy苹果助手未受信任_苹果ios企业签名后App无法安装?如何解决?
- IDEA 2017.3.4 破解到2099年方法
- 我的MBTI 职业性格分析报告——ISFP型
- mysql查询重名_同名同姓搜索,同名身份证号码数据库
- debian系统使用NTP服务器并自动同步时间
- d3.js transition无限循环
- 土豪小米天价域名背后 互联网商业模式重组
热门文章
- lvgl8.2 分析画面刷新
- 如何实现:手机监控PC桌面?(附源码)
- 超链接小点html,html超链接取消鼠标点指显示小手
- 计算机地图制图符号制作的心得,计算机地图制图原理与方法——地图符号设计参考文档...
- 微小区客户成功服务流程
- 电子元件-继电器知识汇总
- MySQL数据库应用与开发答案_MySQL数据库应用与开发习题解答与上机指导
- java日期格式化 类_Java日期格式化(DateFormat类和SimpleDateFormat类)
- 如何查看局域网内所有在线的ip
- Linux版的led显示屏控制软件,中航Led显示屏控制软件下载