动态代理模式;实现方式有两种:反射包中的Proxy类,被代理的类必须实现接口,
今天我们要讨论的是用Proxy类实现动态代理,首先我们队Proxy类做一个入门:
Class subHandler = Proxy.getProxyClass(Map.class.getClassLoader(),
那么也就是说,我们或得的是一个实现了Map接口的类对象对应的字节码文件对象;
这就是算是一个入门吧,Proxy身上有一个动态产生代理对象的静态方法的newProxyInstance();他需要三个参数,前两个和上面的方法一样,第三个参数是一个InvocationHandler;这是一个处理代理请求的类,为代理类和目标类进行牵线搭桥;
好了我们这里牵扯出了三个概念:
1 目标类:就是说哪个类要被代理;
2 代理类,为目标类服务的类,就是代理类;
3 代理请求处理类,将目标类和代理类联系起来.
public static void testCollectionProxy() {
final ArrayList list = new ArrayList();
Collection collection = (Collection) Proxy.newProxyInstance(
Collection.class.getClassLoader(),
new Class[] { Collection.class }, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
long beginTime = System.currentTimeMillis();
Object reVal=null;
if("add".equals(method.getName()))
reVal = method.invoke(list, args);
long endTime = System.currentTimeMillis();
System.out.println("run time "+(endTime-beginTime));
if (reVal==null)
return 2;
else
return reVal;
}
});
collection.add("dfa");
collection.add("daf");
collection.add("dfafds");
collection.size();
collection.clear();
}
在我们获取到的代理对象,调用代理对象的方法时,InvocationHandler都会对调用的方法进行拦截,如果我们要对这个方法动手在invoke方法上动手脚...未完待续............
<script type="text/javascript" id="wumiiRelatedItems"> </script>