代理模式基本概念:
1.代理模式的作用:为其他对象提供一种以控制对方的访问
在某种情况下,一个客户不想或者不能直接引用另一个对象,代理可以在客户端和目标对象之间起到中介的作用
代理的角色:
(1)抽象角色:声明真实对象和代理对象的共同接口(比如租房,抽象角色就是把租房这件事给抽象成一个接口)
(2)代理角色:代理对象内部含有真实对象的引用,从而可以操纵真实的对象,同时代理对象提供与真实对象相同的接口,以便在任何时候都能代替真实对象。代理对象可以在执行真实对象操作时附加其他的操作(比如,租房时,中介收中介费),相对于真实对象进行封装。
(3)真实角色:代理对象所代理的真实角色,是我们要引用的对象

2.JDK动态代理
JDK动态代理可以为所有接口的实现类提供代理
动态代理开发步骤:
(1)创建一个实现接口InvocationHandler的类,它必须实现invoke方法
(2)创建被代理对象的类和接口
(3)通过Proxy.newProxyInstance()来创建代理类
(4)通过代理来调用被代理对象的方法

静态代理demo:模拟通过代理租房

  1. package proxydemo;
  2.  
  3. public interface HireHouse {
  4.  
  5. public void hire();
  6. }

HireHouse

  1. package proxydemo;
  2.  
  3. public class HireHouseImpl implements HireHouse {
  4.  
  5. @Override
  6. public void hire() {
  7. System.out.println("我要租房");
  8.  
  9. }
  10.  
  11. }

HireHouseImpl

代理类,实现HireHouse接口,持有代理对象(真实对象的引用)

  1. package proxydemo;
  2.  
  3. public class HireHouseProxy implements HireHouse {
  4.  
  5. private HireHouse hh;//代理对象,持有真实对象的引用
  6.  
  7. public HireHouseProxy(HireHouse hh) {
  8. /*多态方式,接收接口的实现类对象,为静态代理,缺点是,只能给租房这件事做代理,
  9. *因为传递进来的是HireHouse这个接口的实现类对象 ,不能代理其他的事情*/
  10. super();
  11. this.hh = hh;
  12. }
  13.  
  14. @Override
  15. public void hire() {
  16. System.out.println("收中介费");//代理做的事情
  17. hh.hire();//真实对象租房
  18. System.out.println("扣押金");//代理做的
  19.  
  20. }
  21.  
  22. }

HireHouseProxy

调用代理类:

  1. package proxydemo;
  2.  
  3. public class Client {
  4.  
  5. public static void main(String[] args) {
  6. HireHouse proxyHire = new HireHouseProxy(new HireHouseImpl());
  7. System.out.print("---通过代理租房:");
  8. proxyHire.hire();//通过代理租房
  9. System.out.print("---真实对象自己租房:");
  10. new HireHouseImpl().hire();//真实对象自己租房
  11.  
  12. }
  13. }

Client

动态代理demo:

  1. package proxydemo.dynamic.proxy;
  2. /**
  3. * 真实对象和代理对象的共同接口,不仅仅能租房。
  4. * @author Administrator
  5. *
  6. */
  7. public interface HireHouse {
  8.  
  9. public void hire();
  10. }

接口实现类:

  1. package proxydemo.dynamic.proxy;
  2.  
  3. public class HireHouseImpl implements HireHouse {
  4.  
  5. @Override
  6. public void hire() {
  7. System.out.println("我要租房");
  8. }
  9. }

代理类,实现InvocationHandler 接口

  1. package proxydemo.dynamic.proxy;
  2.  
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5.  
  6. /**
  7. * 实现InvocationHandler接口,通过反射去调用被代理的接口
  8. * @author Administrator
  9. *
  10. */
  11. public class HireProxy implements InvocationHandler {
  12. // 被代理的真实角色
  13. private Object obj;// 真实角色,要给任何对象做代理,只能是持有Object类型的对象
  14.  
  15. public HireProxy(Object obj) {
  16. super();
  17. this.obj = obj;
  18. }
  19.  
  20. /**
  21. * jdk动态代理,被代理对象必须实现接口
  22. * 被代理的对象必然实现共同的Hire接口,那么就有方法
  23. * method:被代理的对象的接口中的方法,要调用方法,必须有对象,此处这个对象就是被代理对象,因此必须要指定被代理的对象
  24. * args是被代理对象接口的方法的参数,调用proxy对象的method方法
  25. */
  26. @Override
  27. public Object invoke(Object proxy, Method method, Object[] args)
  28. throws Throwable {
  29. System.out.println("前置工作");
  30. // for (Object object : args) {
  31. // System.out.print("invoke方法中的第三个参数:"+object +" ");//给list做代理时测试用
  32. // }
  33. Object invoke = method.invoke(obj, args);
  34. System.out.println("\n后置工作");
  35. return invoke;
  36. }
  37.  
  38. }

动态代理测试:

  1. package proxydemo.dynamic.proxy;
  2.  
  3. import java.lang.reflect.Proxy;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6.  
  7. public class Client {
  8.  
  9. public static void main(String[] args) {
  10. // 创建被代理的接口实现类对象
  11. HireHouseImpl hhi = new HireHouseImpl();
  12. //创建代理对象:第一个参数是被代理的对象的类加载器,第二个是被代理对象的类的所有接口,第三个参数是自定义代理类的角色
  13. HireHouse hh =
  14. (HireHouse)Proxy.newProxyInstance(hhi.getClass().getClassLoader(),
  15. hhi.getClass().getInterfaces(), new HireProxy(hhi));
  16. hh.hire();
  17.  
  18. // 给list做代理
  19. // List list = new ArrayList();
  20. // List hh1 = (List) Proxy.newProxyInstance(list.getClass()
  21. // .getClassLoader(), list.getClass().getInterfaces(),
  22. // new HireProxy(list));
  23. // hh1.add("张三");
  24. // hh1.get(0);//被代理对象的所有方法都被代理了
  25.  
  26. }
  27. }

Java反射及注解学习- 反射的使用 - JDK动态代理的更多相关文章

  1. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring JDK动态代理

    JDK 动态代理是通过 JDK 中的 java.lang.reflect.Proxy 类实现的.下面通过具体的案例演示 JDK 动态代理的使用. 1. 创建项目 在 MyEclipse 中创建一个名称 ...

  2. java学习笔记(中级篇)—JDK动态代理

    一.什么是代理模式 相信大家都知道代理商这个概念,在商业中,代理商无处不在.假设你要去买东西,你不可能去找真正的厂家去买,也不可能直接跟厂家提出需求,代理商就是这中间的一桥梁,连接买家和厂商.你要买或 ...

  3. aop学习总结一------使用jdk动态代理简单实现aop功能

    aop学习总结一------使用jdk动态代理实现aop功能 动态代理:不需要为目标对象编写静态代理类,通过第三方或jdk框架动态生成代理对象的字节码 Jdk动态代理(proxy):目标对象必须实现接 ...

  4. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring CGLlB动态代理

    JDK 动态代理使用起来非常简单,但是它也有一定的局限性,这是因为 JDK 动态代理必须要实现一个或多个接口,如果不希望实现接口,则可以使用 CGLIB 代理. CGLIB(Code Generati ...

  5. Java代理(静态代理、JDK动态代理、CGLIB动态代理)

    Java中代理有静态代理和动态代理.静态代理的代理关系在编译时就确定了,而动态代理的代理关系是在运行期确定的.静态代理实现简单,适合于代理类较少且确定的情况,而动态代理则给我们提供了更大的灵活性. J ...

  6. 【Java】利用注解和反射实现一个"低配版"的依赖注入

    在Spring中,我们可以通过 @Autowired注解的方式为一个方法中注入参数,那么这种方法背后到底发生了什么呢,这篇文章将讲述如何用Java的注解和反射实现一个“低配版”的依赖注入. 下面是我们 ...

  7. Java基础之反射生成JDK动态代理

    在Java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口.通过这个类和接口可以生成JDK动态代理类或动态代理对象. JDK动态代理例子: / ...

  8. 静态代理和利用反射形成的动态代理(JDK动态代理)

    代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 静态代理 1.新建 ...

  9. java jdk动态代理学习记录

    转载自: https://www.jianshu.com/p/3616c70cb37b JDK自带的动态代理主要是指,实现了InvocationHandler接口的类,会继承一个invoke方法,通过 ...

随机推荐

  1. Docker 里面新建mysql 容器

    1.获取MySQL镜像, a.直接从docker hub 下载docker镜像 docker pull +镜像名称 b.从别的项目上把镜像export出来 dockr load  i + 镜像的TAR ...

  2. 软件-Jenkins:Jenkins 百科

    ylbtech-软件-Jenkins:Jenkins 百科 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续 ...

  3. JS-计算身份证校验码(最后一位)

    在线预览 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  4. JS-格式化json

    一 使用原生 JSON.stringify 实现 <textarea name="" id="myTA" cols="30" rows ...

  5. day17—Flex弹性布局详解(一)

    转行学开发,代码100天——2018-04-02 今天看到一篇大神的文章,关于flex布局的详解,对flex用法介绍的相当详细,非常有助于我等初学者更深入了解这种布局方式. 文章链接 [基础知识]Fl ...

  6. 判断文件是否存在的shell脚本代码!

    实现代码一 #shell判断文件夹是否存在 #如果文件夹不存在,创建文件夹 if [ ! -d "/Top" ]; then mkdir -p /Topfi #shell判断文件, ...

  7. input只输入数字和小数后两位

    html:<input  name="" type="tel" value="" placeholder="请输入金额&qu ...

  8. 给url添加时间戳,解决浏览器缓存

    //解决浏览器缓存function timestamp(url){ // var getTimestamp=Math.random(); var getTimestamp=new Date().get ...

  9. C#=> 栈模仿堆的操作

    //原理,利用两个栈,互相作用,来模仿堆的效果,先进先出.. using System; using System.Collections.Generic; using System.Linq; us ...

  10. 《JAVA设计模式》之单例模式(Singleton)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述单例模式的: 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的 ...