相比于静态代理,动态代理避免了开发者编写各个繁锁的静态代理类,只需指定一组接口及目标类对象就能动态地获取代理对象。

  

  使用动态代理的六大步骤:

  1 通过实现InvocationHandler接口来自定义自己的InvocationHandler。

  2 通过Proxy类的getProxyClass方法获取代理类。

  3 通过反射机制获取代理类的构造方法,方法签名为getConstructor(InvocationHandler.class)。

  4 将目标对象作为参数传入,通过构造方法获取自定义的InvocationHandler实例对象。

  5 将自定义的InvocationHandler实例对象作为参数传入,通过构造方法获取代理对象。

  6 代理对象调用目标方法。

  JDK Proxy HelloWorld

1 package com.yao.proxy;
2
3 public interface Helloworld {
4     void sayHello();
5 }

1 package com.yao.proxy;
2
3 import com.yao.HelloWorld;
4
5 public class HelloworldImpl implements HelloWorld {
6     public void sayHello() {
7         System.out.print("hello world");
8     }
9 }

 1 package com.yao.proxy;
 2
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5
 6 public class MyInvocationHandler implements InvocationHandler{
 7     private Object target;
 8     public MyInvocationHandler(Object target) {
 9         this.target=target;
10     }
11     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
12         System.out.println("method :"+ method.getName()+" is invoked!");
13         return method.invoke(target,args); // 执行相应的目标方法
14     }
15 }

  target属性表示代理的目标对象。InvocationHandler是连接代理对象与目标对象的自定义中间类MyInvocationHandler必须实现的接口,只有一个方法public Object invoke(Object proxy, Method method, Object[] args)。在这个方法中,Proxy通过newProxyInstance方法创建代理对象,method表示目标对象被调用的方法,args表示目标对象被调用方法的形参列表。

 1 package com.yao.proxy;
 2
 3 import com.yao.HelloWorld;
 4 import java.lang.reflect.Constructor;
 5 import java.lang.reflect.InvocationHandler;
 6 import java.lang.reflect.InvocationTargetException;
 7 import java.lang.reflect.Proxy;
 8
 9 public class JDKProxyTest {
10     public static void main(String[]args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
11         // 这里有两种写法,采用复杂的一种写法,有助于理解。
12         Class<?> proxyClass= Proxy.getProxyClass(JDKProxyTest.class.getClassLoader(),HelloWorld.class);
13         final Constructor<?> cons = proxyClass.getConstructor(InvocationHandler.class);
14         final InvocationHandler ih = new MyInvocationHandler(new HelloworldImpl());
15         HelloWorld helloWorld = (HelloWorld)cons.newInstance(ih);
16         helloWorld.sayHello();
17
18         // 下面是简单的一种写法,本质上和上面是一样的
19         /*
20         HelloWorld helloWorld=(HelloWorld)Proxy.
21                  newProxyInstance(JDKProxyTest.class.getClassLoader(),
22                         new Class<?>[]{HelloWorld.class},
23                         new MyInvocationHandler(new HelloworldImpl()));
24         helloWorld.sayHello();
25         */
26     }
27
28 }

  

  参考资料

  深度剖析JDK动态代理机制

  JDK动态代理详解

  JDK动态代理源码解析

转载于:https://www.cnblogs.com/WJQ2017/p/7688317.html

Java 动态代理 Demo相关推荐

  1. java jdk动态代理 cglib动态代理demo

    最近在研究java动态代理这块,以前也看了很多次java动态代理,感觉一直不是怎么明白,这两天看了看又明白了些,现给出我参考网上写的一个demo jdk动态代理实现: View Code import ...

  2. Java 动态代理机制分析及扩展--转

    http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/#icomments http://www.ibm.com/developerworks/c ...

  3. Java 动态代理实践AOP

    2019独角兽企业重金招聘Python工程师标准>>> 大家都知道Spring中AOP是通过Java动态代理实现的,今天就来简单学习下demo. Java动态代理主要有两个核心类,I ...

  4. java动态代理原理及解析

    转载自 http://blog.csdn.net/scplove/article/details/52451899 代理:设计模式 代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制 ...

  5. java动态代理原理

    代理:设计模式 代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 通过 ...

  6. Java 静态代理、Java动态代理、CGLIB动态代理

    为什么80%的码农都做不了架构师?>>>    Java 的代理就是客户类不再直接和委托类打交道, 而是通过一个中间层来访问, 这个中间层就是代理.为啥要这样呢, 是因为使用代理有 ...

  7. Javaweb安全——Java动态代理

    Java 动态代理 Java的java.lang.reflect包下提供了一个Proxy类和InvocationHandler接口,可以生成JDK动态代理类或对象来完成程序无侵入式扩展(即不通过继承接 ...

  8. java动态代理【一】

    java动态代理的定义:为其他目标类的方法增加切面的逻辑,即在执行目标类方法的时候,先去执行一段如校验检测的逻辑代码.java通俗一点就是生成一个继承目标类的子类,并在每个调用方法都添加一段逻辑. 应 ...

  9. Java动态代理的实现

    动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程. 友情提示:本文略有难度,读者需具备代理模式相关基础知识,. ...

  10. Java动态代理与Cglib代理

    为什么80%的码农都做不了架构师?>>>    最近又继续回来死磕Spring源码,以前看的也忘得差不多了,这次先把Spring使用的动态代理cglib看了一下,打好基础知识. cg ...

最新文章

  1. win7计算机创建新用户,win7系统无法创建新用户的解决方法
  2. ORACLE姚翔,- oalib
  3. 使用beanUtils操纵javabean
  4. Android APK反编译详解(附图)(转)
  5. VTK:行进立方体用法实战
  6. VTK:标签顶点和边用法实战
  7. leetcode——242. 有效的字母异位词
  8. 惠普10代的服务器有哪些型号,英特尔官方科普:秒懂十代酷睿型号怎么认!
  9. 电表的改装与校准大学物理实验报告_电学实验 一 : 电表的改装、使用与读数...
  10. 复变函数、运筹学与概率论知识总结
  11. js百度地图小车html,百度地图web开发(基于javascript)
  12. FRR BGP协议分析10 -- 路由衰减
  13. linux下添加定时任务
  14. 注解的引入以及注解的使用
  15. 深度装机大师一键重装_电脑店U盘重装系统教程
  16. 用python写网络爬虫-英文翻译
  17. 尚硅谷 硅谷新闻_如果每个人都遥不可及,硅谷会损失什么
  18. 原神服务器不稳定,原神天空岛和世界树服务器哪个好
  19. H3C交换机级联式堆叠配置方式
  20. java 求arctan()

热门文章

  1. 陈丹琦NLP团队敢于挑战权威!谁说BERT只能Mask 15%?
  2. 【深度语义匹配模型】实践篇:语义匹配在贝壳找房智能客服中的应用
  3. 【从 0 开始机学习】正则化技术原理与编程!
  4. 大数定律和中心极限定理的区别和联系
  5. python—datatable加载数据
  6. 深度学习2.0-22.Keras高层接口之自定义层或网络
  7. C# where()筛选方法
  8. Android开发时的多点触控是如何实现的?
  9. 豆瓣评分9.9!国内外口碑炸裂的强化学习圣经中文版终于来了!
  10. 阿里、Uber都在用的Flink你了解多少?