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代理)
//邓紫棋服务菜单 : 唱歌,跳舞 interface IDengziqi { void sing(); void dance();}
目标对象:
//目标对象 , 邓紫棋实实在在的在唱歌和跳舞public class DengziqiImpl implements IDengziqi { @Override public void sing() { System.out.println("邓紫棋为你唱歌...."); } @Override public void dance() { System.out.println("邓紫棋为你跳艳舞...."); }}
代理对象
//代理对象 精济人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; } }); }}
测试
// 测试类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();//审核条件达标者, 通过,让邓紫棋跳舞 }}
结果:
这家伙有钱...
邓紫棋为你唱歌....大爷很满意 这家伙有钱...邓紫棋为你跳艳舞....大爷很满意