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

结果:

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


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

大爷很满意

原文地址:https://www.cnblogs.com/bravolove/p/8179881.html