学习动态代理之前需要了解静态代理 并且牢记静态代理的缺点

//首先被代理的类需要实现一个接口
public interface ProxyInterface {public void say(String str);
}//然后写一个实现类   也就是需要被代理的类
public class ProxyImpl implements ProxyInterface {@Overridepublic void say(String str) {System.out.println("ProxyImpl.say is " +str);}
}//然后写代理类
public class ProxyClass implements InvocationHandler {Object o;public void setTarget(Object o){this.o = o;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("在调用方法之前执行的方法");   method.invoke(o,args);System.out.println("在调用方法之后执行的操作");return null;}
}//调用
//    jdk动态代理public static void main(String[] args) {ProxyInterface proxyInterface = new ProxyImpl();ProxyClass proxyClass = new ProxyClass();proxyClass.setTarget(proxyInterface);//传递被代理类的类加载器 接口  代理类  返回被代理类ProxyInterface proxy = (ProxyInterface)Proxy.newProxyInstance(proxyInterface.getClass().getClassLoader(),proxyInterface.getClass().getInterfaces(),proxyClass);System.out.println("------------------------------------------");proxy.say("hello");System.out.println(proxy.getClass().getName());System.out.println(proxyInterface.getClass().getName());}

结果:
D:\development_tool\jdk1.8.0_181\bin\java.exe

在调用方法之前执行的方法
ProxyImpl.say is hello
在调用方法之后执行的操作
com.sun.proxy.$Proxy0 //这是jdk生成的代理类
com.test.Proxy.ProxyImpl //这是被代理的类

Process finished with exit code 0


说明:
代理类 ProxyClass 需要实现接口InvocationHandler 并重写里面的方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(“在调用方法之前执行的方法”);
method.invoke(o,args);
System.out.println(“在调用方法之后执行的操作”);
return null;
}

其中 method.invoke(o,args);
除第一个参数外剩下的是固定写法 第一个参数就是我们要代理的实现类
在method.invoke(o,args); 之前我们加的方法或者代码 都会在被代理的方法之前执行
在method.invoke(o,args); 之后我们加的方法或者代码 都会在被代理的方法之后执行


动态代理是为了解决静态代理的缺点而诞生的,所以我们要了解动态代理与静态代理的区别
区别:
动态代理不需要我们手写代理类,上述ProxyClass 我们说他是代理类 是因为写法不同 假设不写ProxyClass这个类 我们可以这样实现动态代理

    public static void main(String[] args) {ProxyInterface proxyInterface = new ProxyImpl();ProxyInterface proxy = (ProxyInterface)Proxy.newProxyInstance(proxyInterface.getClass().getClassLoader(), proxyInterface.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("之前执行");method.invoke(proxyInterface,args);System.out.println("之后执行");return null;}});proxy.say("另一种实现");}
//结果
之前执行
ProxyImpl.say is 另一种实现
之后执行Process finished with exit code 0

第一种写法不过是把InvocationHandler接口的实现写写出来,第二种则是在用到时候在实现InvocationHandler接口
无论怎么写 我们以第一种写法为例:我们会发现两件事

  1. 我们的代理与具体哪个接口无关,我们只需要传递我们要实现代理的实现类就行了
  2. 如果接口改变了,我们的代理类不需要做任何变动
    知道以上两点 我们就知道为什么交动态代理了,

我们的代理类实际上是在jdk中编译期间动态生成的,换句话说,我们的jdk在编译的时候,根据proxyInterface.getClass().getInterfaces()这个接口 动态创建了他的实现类,由于编译的时候才生成的实现类,所以接口必然不会改变了,而同时实现代理的时候,是传递需要代理类,的实现,无关接口 所以并不需要为每一种接口都写一个代理类了,

总结起来就是动态代理把静态代理需要预先人为写出代理类的步骤交给jdk在编译的时候生成,所以避免了静态代理的缺点

代理模式之jdk动态代理的实现相关推荐

  1. 代理模式 、JDK动态代理、cglib动态代理

    代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢? 因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思. 再如我 ...

  2. 【设计模式】代理模式之JDK动态代理与CGLIb代理区别

    一.什么是代理? 代理模式是Java中常见的一种模式,英文名字叫走Proxy或者Surrogate,代理的本意是一个人代表另一个人,或者一个机构代表另一个机构,采取行动,因而,代理和现实生活中的中介有 ...

  3. 代理模式及JDK动态代理(InvocationHandler)的简单实现与分析

    在慕课网上学习了讲解代理模式的一个课程--<模式的秘密--代理模式>,感叹于David老师屌炸天的PPT,同时,老师一步一步模仿JDK源码去写code,教我们去简单实现JDK中的动态代理, ...

  4. 【Spring6】| GoF之代理模式(JDK动态代理和CGLIB动态代理)

    目录 一:GoF之代理模式 1. 对代理模式的理解 2. 静态代理 3. 动态代理 3.1 JDK动态代理 3.2 CGLIB动态代理 一:GoF之代理模式 1. 对代理模式的理解 生活场景1:牛村的 ...

  5. 代理模式之详谈动态代理模式(Spring的AOP实现)

    java动态代理实现与原理详细分析 1.代理模式 关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 代理 ...

  6. 动态代理,动态代理设计模式 ,JDK动态代理,cglib动态代理

    为什么80%的码农都做不了架构师?>>>    一:在看此篇代码示例前,先看静态代理, 链接地址:http://my.oschina.net/dyyweb/blog/656760   ...

  7. 设计模式(十三) 代理模式和Java动态代理

    Proxy Pattern 1. 什么是代理模式 代理模式: 给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问. Proxy Pattern: Provide a surrogate ...

  8. 代理设计模式(JDK动态代理)什么是代理,静态代理动态代理实现,分析JDK代理实现逻辑,手动实现JDK代理逻辑。

    什么是代理? 从字面意思来看,代理比较好理解,无非就是代为处理的意思.举个例子,现在哪吒有女助理了,所以很多事情都不用我自己去处理了,比如说去银行排队取钱,那么我就可以叫我的女助理去代替我取钱并交给我 ...

  9. 代理模式中的动态代理

    动态代理和静态对比基本思路是一致的,只不过动态代理功能更加强大,随着业务的扩展适应性更强.如果还以找对象为例,使用动态代理相当于是能够适应复杂的业务场景.不仅仅只是父亲给儿子找对象,如果找对象这项业务 ...

最新文章

  1. chown -r oracle:oinstall /oracle,ORA-17503: 因为CHOWN -R ORACLE:OINSTALL 导致的
  2. Eclipse修改web项目的jdk编译版本
  3. php遍历中记录所有,php遍历类中包含的所有元素的方法
  4. IDEA下的使用git
  5. Tensorflow Object detection API 在 Windows10 配置
  6. The only difference is that they are written
  7. beta阶段——项目复审
  8. 整理几个有想法的面试题
  9. 深度学习代码实战——基于RNN的时间序列拟合(回归)
  10. mysql 体系架构设计_MySQL数据库的体系架构(转载)
  11. SQL语句批量替换某个指定的字符串
  12. 哆啦A梦版主题餐厅手游《机器猫烧烤店BBQ》
  13. 2007-2015个人绿色软件合集下载
  14. php 数字上下选取,选择性粘贴数值快捷键是什么
  15. 124-移动端游乐园项目
  16. cad文件默认打开程序改为acad程序
  17. 为什么我们越娱乐反而会越无聊?
  18. 量子力学在计算机上的应用论文,《浅谈量子力学的发展与利用》-毕业论文.docx...
  19. sa-token使用
  20. 局部搜索、模拟退火和遗传算法求解TSP问题

热门文章

  1. 基于图像和激光的多模态点云融合与视觉定位
  2. 浏览器批量打开网站在线工具
  3. Word模板文件,替换内容 文本、图片、表格、列表、区块、嵌套等
  4. 天网防火墙 与 Filemon和Regmon 有冲突
  5. 【threejs效果:模型炸开】以钢铁侠obj模型为例
  6. 一个新手村的软件测试求职之路的小心得
  7. 计算机不能启动 无法验证数字签名,Win10提示错误0xc0000428无法验证此文件的数字签名怎么办?...
  8. Oralce EBS R12 订单行状态:实施,工作流状态: 发票连接,错误处理办法
  9. P图片放大不失真方法
  10. element-ui时间组件使用