相信很多小伙伴都不理解动态代理,
它是怎么代理的?怎么用?听了很多课程还是不会
我这次用最简单通俗易懂的代码来解释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分钟带你快速理解动态代理)全网最简相关推荐

  1. Java集合核心详解【十分钟带你了解整个集合体系】

    前言: 集合是Java中非常重要的一章,学习难度也相对较大,不会很快就能掌握,这里我们先对集合框架有一个大概的了解,记住其中的基础知识,后面深入研究某一个集合时,才能更好的掌握. 文章目录 一.集合介 ...

  2. 千文详解:十分钟带你深入了解华为交换机的通信原理

    ##前言 今天给大家讲解一下关于华为交换机的一些知识内容,如果是打算从事工作的朋友,走过路过别错过了~ ####交换机 交换机是当今以太网中最常见的存储转发设备,工作在数据链路层,通过读取数据包中的M ...

  3. Raft 协议原理详解,10 分钟带你掌握

    之前写了一篇文章<肝了一个月的ETCD,从Raft原理到实践>,干货真的很多,但是无人转载,同事说文章太长了,不方便阅读.那这篇文章,我只选取里面的 Raft 协议,精华提炼,可读性更强! ...

  4. Android 动态分区详解(一) 5 张图让你搞懂动态分区原理

    文章目录 0. 导读 1. 动态分区详解的背景 1.1 背景 1.2 动态分区的本质 2. Linux device mapper 驱动 3. Android 动态分区布局 3.1 动态分区布局 3. ...

  5. JAVA动态代理详解

    JAVA动态代理详解 问题 1:什么是静态代理,动态代理? 2:动态代理的好处? 什么是静态代理 以生活中例子来看,我作为某某品牌面膜的北京区代理,我替厂家卖面膜,我属于代理,厂家属于委托方. 联系到 ...

  6. 静态代理,动态代理,Cglib代理详解

    一.静态代理 新建一个接口 定义一个玩家方法: package com."".proxy.staticc;public interface Iplayer { public voi ...

  7. Pause/Resume Instance 操作详解 - 每天5分钟玩转 OpenStack(34)

    Pause/Resume Instance 操作详解 - 每天5分钟玩转 OpenStack(34) 本节通过日志详细分析 Nova Pause/Resume 操作. 有时需要短时间暂停 instan ...

  8. Cinder 组件详解 - 每天5分钟玩转 OpenStack(47)

    Cinder 组件详解 - 每天5分钟玩转 OpenStack(47) 本节我们将详细讲解 Cinder 的各个子服务. cinder-api cinder-api 是整个 Cinder 组件的门户, ...

  9. python动态类型的坑_python进阶教程之动态类型详解

    动态类型(dynamic typing)是Python另一个重要的核心概念.我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值.这些都与动态类型的概念 ...

  10. Android 动态分区详解(六) 动态分区的底层机制

    文章目录 1. Android 动态分区的两重含义 2. device mapper 的原理 3. linear 映射的原理 3.1 多个设备映射示例 3.2 `dmsetup create` 命令参 ...

最新文章

  1. webpack基础概念
  2. MySQL 之全文索引
  3. Gitlab+Gerrit+Ldap+nginx+mysql 之Gerrit搭建与配置(一)
  4. 用Java创建MongoDB上限集合
  5. 程序员怎么看待C语言?最伟大?最落后?
  6. TLS1.1升级到TLS1.2(微信小程序要求TLS1.2以上)
  7. php sqlsrv 分页,sqlsrv php分页
  8. phtread条件变量pthread_cond_t初始化方式
  9. WinForm实现SQLServer存储图片
  10. CSDN博客喜遇中兴老同事
  11. 如何使用速问速答求解一元二次方程
  12. SAN(存储区域网络),WWN, WWPN,WWNN区别
  13. html5辅助,Disable HTML5 Autoplay
  14. xy苹果助手未受信任_苹果ios企业签名后App无法安装?如何解决?
  15. IDEA 2017.3.4 破解到2099年方法
  16. 我的MBTI 职业性格分析报告——ISFP型
  17. mysql查询重名_同名同姓搜索,同名身份证号码数据库
  18. debian系统使用NTP服务器并自动同步时间
  19. d3.js transition无限循环
  20. 土豪小米天价域名背后 互联网商业模式重组

热门文章

  1. lvgl8.2 分析画面刷新
  2. 如何实现:手机监控PC桌面?(附源码)
  3. 超链接小点html,html超链接取消鼠标点指显示小手
  4. 计算机地图制图符号制作的心得,计算机地图制图原理与方法——地图符号设计参考文档...
  5. 微小区客户成功服务流程
  6. 电子元件-继电器知识汇总
  7. MySQL数据库应用与开发答案_MySQL数据库应用与开发习题解答与上机指导
  8. java日期格式化 类_Java日期格式化(DateFormat类和SimpleDateFormat类)
  9. 如何查看局域网内所有在线的ip
  10. Linux版的led显示屏控制软件,中航Led显示屏控制软件下载