动态代理

基于反射机制

代理: A类访问B类,但A类不能直接访问B类。可以建立C类,A类访问C类,C类访问B类,C类就是代理 //A:客户        B:目标        C:代理
代理模式作用:1.功能增强        2.控制访问

静态代理:代理类是手工实现的,目标类是确定的       //实现简单、便于理解

  1. 创建接口,定义好目标类和代理类的功能
  2. 创建目标类、代理类,实现接口
  3. 创建客户类,调用代理类的方法

        缺点:当目标增加了,代理类可能也需要对应增加,代理类数量过多。接口增加方法,会影响到众多的实现类(代理类、目标类)


动态代理:在程序执行过程中使用JDK的反射机制,创建代理类对象,动态指定要代理的目标类         //动态:在程序运行时(运行阶段)
                           ( 是一种创建Java对象的能力,能够不创建代理类就能创建出代理类对象)
                优点:当目标类数量很多,代理类数量也可以很少。增加了接口的方法,也不会影响代理类

        方式:
                1)JDK动态代理:使用Java反射包中的类和接口实现动态代理功能          //要求:必须有接口
                2)CGLIB动态代理:CGLIB是第三方工具库。是通过继承目标类,重写子类的方法来实现功能的修改   //要求:父类和方法不能是final  
      
JDK动态代理
       遇到的类(反射包中的):Method         
                                                  InvocationHandler接口       //调用处理器
                                                          方法:public Object invoke(Object proxy, Method method, Object[] args)  //代理对象要执行的功能代码,即:调用目标方法、功能增强
                                                                        //该方法不需要我们显示调用
                                                                            参数    proxy:jdk创建的动态代理对象
                                                                                       method:目标类中的方法的类对象        
                                                                                       args:目标类中方法的参数
                                                 Proxy:创建代理对象的类   //之前创建对象用new
                                                         静态方法:public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)     // 创建并返回代理动态对象
                                                                              参数        loader:目标对象的类加载器,负责向内存中加载对象    //可以通过反射获得类加载器
                                                                                             interfaces:目标对象的类所实现的接口类对象          //也是通过反射获取
                                                                                             h:InvocationHandler接口的实现类的对象  //代理的功能代码
实现步骤                                                                    

  1. 创建接口,定义目标类要完成的功能。创建目标类,实现接口,创建目标类对象。
  2. 创建InvocationHandler接口的实现类,在invoke方法中完成代理的功能,利用构造方法创建出其对象             
    1. 调用目标方法: method.invoke(目标类对象,参数)         
    2. 增强功能
    3. 实现类中实现用构造方法传入目标对象并赋值给私有属性                     //这样method.invoke(目标类对象,参数) 的目标对象就能使用了
  3. 使用Proxy类的静态方法newProxyInstance创建代理对象,并把返回值转为接口类型
  4. 调用代理对象,执行方法   //会根据方法名----method参数(即:方法类对象),实参----method.invoke(实参)的实参----method.invoke(实参)的实参---args参数(即:目标类方法的参数)

       
                 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值