复习上一讲动态代理内容和程序,那个程序非常重要,下面总结一下动态代理内容,并再举一个例子强化
1. 通过这种方式,被代理的对象(RealSubject)可以在运行时动态改变,需要控制的接口(Subject接口)可以在运行时改变,控制的方式(DynamicSubject类)也可以动态改变,从而实现了非常灵活的动态代理关系
2. 动态代理是指客户通过代理类来调用其它对象的方法
(1) 动态代理使用场合:
1) 调试
2) 远程方法调用(RMI)
图67-1:动态代理
3. 动态代理步骤
1). 创建一个实现接口InvocationHandler的类,它必须实现invoke方法
2). 创建被代理的类以及接口
3). 通过Proxy的静态方法
newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 创建一个代理
4). 通过代理调用方法
编译执行结果:package com.ahuier.dynamicproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.List; import java.util.Vector; /* * 这边被代理的类是使用JDK自带的Vector类 */ public class VectorProxy implements InvocationHandler { private Object proxyObj; public VectorProxy(Object obj) { this.proxyObj = obj; } public static Object factory(Object obj) { Class<?> classType = obj.getClass(); return Proxy.newProxyInstance(classType.getClassLoader(), classType.getInterfaces(), new VectorProxy(obj)); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before calling:" + method); if(null != args){ for(Object obj: args){ System.out.println(obj); } } Object object = method.invoke(proxyObj, args); System.out.println("after calling"); return object; } public static void main(String[] args) { List v = (List)factory(new Vector()); System.out.println(v.getClass().getName()); v.add("New"); v.add("York"); System.out.println(v); v.remove(0); System.out.println(v); } }
$Proxy0
before calling:public abstract boolean java.util.List.add(java.lang.Object)
New
after calling
before calling:public abstract boolean java.util.List.add(java.lang.Object)
York
after calling
before calling:public java.lang.String java.lang.Object.toString()
after calling
[New, York]
before calling:public abstract java.lang.Object java.util.List.remove(int)
0
after calling
before calling:public java.lang.String java.lang.Object.toString()
after calling
[York]
【说明】:这种动态代理模式,是重点的东西,要学习动态代理的思想,这样对以后框架学习Sprint是非常有帮助的。这边注释不是很多,找空会将其一一补上。