zoukankan      html  css  js  c++  java
  • java--02--动态代理

     1 动态代理,
     2     1)代理对象,不需要实现接口;
     3     2)代理对象的生成,是利用JDK API, 动态的在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型;);
     4     3)  动态代理, JDK代理, 接口代理;
     5 
     6 JDK中生成代理对象的API:
     7 |-- Proxy
     8     static Object newProxyInstance(
     9 ClassLoader loader,       指定当前目标对象使用类加载器
    10  Class<?>[] interfaces,     目标对象实现的接口的类型
    11 InvocationHandler h       事件处理器
    12 )  
    13 
    14 
    15 动态代理总结:
    16     代理对象不需要实现接口,但是目标对象一定要实现接口;否则不能用动态代理!
    17     (class  $Proxy0  implements IuserDao)
    18 
    19 思考:
    20     有一个目标对象,想要功能扩展,但目标对象没有实现接口,怎样功能扩展?
    21     Class  UserDao{}
    22     // 子类的方式
    23     Class subclass  extends  UserDao{}
    24     
    25     以子类的方式实现(cglib代理)
    View Code
    //邓紫棋服务菜单 : 唱歌,跳舞
     interface IDengziqi {
        void sing();
        void dance();
    }
    View Code

    目标对象:

    //目标对象 , 邓紫棋实实在在的在唱歌和跳舞
    public class DengziqiImpl implements IDengziqi {
    
        @Override
        public void sing() {
            System.out.println("邓紫棋为你唱歌....");
        }
    
        @Override
        public void dance() {
            System.out.println("邓紫棋为你跳艳舞....");
    
        }
    
    }
    View Code

    代理对象

    //代理对象  精济人
    public class DengziqiProxy {
        //邓紫棋来了.
        private Object target;
        public DengziqiProxy(Object target){
            this.target = target;
        }
        
    
        public Object getDengziqiProxy(){ // 获得代理对象,也指向了接口.
            return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                                        target.getClass().getInterfaces(),
                                        new InvocationHandler() {
                                            @Override
                                            public Object invoke(Object proxy, Method method, Object[] args)
                                                    throws Throwable {
                                                System.out.println("这家伙有钱...");
                                                Object result = method.invoke(target, args);
                                                System.out.println("大爷很满意");
                                                return result;
                                            }
                                        });
        }
    }
    View Code

    测试

    // 测试类
    public class ProxyTests {
    
        public static void main(String[] args) {
            //1. 先目标对象
            DengziqiImpl dengziqi = new DengziqiImpl(); //邓紫棋找来了
            
            //2. 代理对象 
            IDengziqi p = (IDengziqi)new DengziqiProxy(dengziqi).getDengziqiProxy();
            p.sing(); //审核条件达标者, 通过,让邓紫棋唱歌
            p.dance();//审核条件达标者, 通过,让邓紫棋跳舞
            
        }
    
    }
    View Code

    结果:

    这家伙有钱...
    邓紫棋为你唱歌....
    大爷很满意


    这家伙有钱...
    邓紫棋为你跳艳舞....

    大爷很满意

  • 相关阅读:
    python报以下错误:TypeError: 'int' object is not subscriptable
    C# Func与Action
    C#调用C++的DLL 尝试写入受保护的内存
    C#调用C++的dll EntryPointNotFoundException
    C# 拖拽事件
    C#操作Access数据库中遇到的问题(待续)
    Winform 中写代码布局中遇到的控件遮盖问题
    thinkphp6执行流程(一)
    xdebug调试过程中apache500超时
    禁用phpcookie以后如何使用Session
  • 原文地址:https://www.cnblogs.com/bravolove/p/8179881.html
Copyright © 2011-2022 走看看