这个例子要解决为一个Vector对象提供一个代理对象。当你访问Vector的任何方法时,在调用的前后都会分别打印出两条信息。这表明代理对象有能力截获和控制这个Vector对象。
系统仅仅需要一个新的类,称为VectorProxy类,此类需要实现InvocationHandler接口的invoke()方法.
可以看出VectorProxy类必须实现invoke()方法,因为这是InvocationHandler接口的要求,由于Vector对象实现了java.util.List接口,因此,通过调用List的方法,可以控制代理对象。
package com.java.patterns.proxy.reflect;
import java.lang.reflect.*;
import java.util.*;
public class VectorProxy implements InvocationHandler
{
//代理对象
private Object proxyobj;
//构造函数
public VectorProxy(Object obj)
{
this.proxyobj=obj;
}
//静态工厂方法
public static Object factory(Object obj)
{
Class cls = obj.getClass();
return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),new VectorProxy(obj));
}
//代理对象的处理函数(实现InvocationHandler接口函数)
/**
*proxy代理对象,这里是proxyobj
*method代理对象执行被代理对象的函数,相当于C++中的函数指针,但Method是个封装函数指针的类,我个人这么认为的^_^
*args是执行函数method的参数数组
*/
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable
{
System.out.println("调用"+method.toString()+"之前");
if(args!=null)
{
System.out.println("调用参数:");
for(int i=0;i<args.length;i++)
{
System.out.println(args[i]+"/");
}
}
Object o = method.invoke(proxyobj,args);
System.out.println("调用"+method.toString()+"之后");
System.out.println("___________________________________________________");
return o;
}
public static void main(String[] args)
{
List v = null;
//List是Vector实现的一个接口,所以可以用这个接口指向实际的代理对象,详细问题查Jdk去,
//我一般很负责任的,只是有时候偷懒
v = (List)factory(new Vector());
v.add("Hello");
v.add("ByeBye");
v.add(1,"Welcome");
v.remove(0);
v.remove(1);
}
}
也就是说代理对象截获了对Vector对象的所有调用,再调用传递给Vector之前和之后,代理对象具有采取合适操作的灵活性,虽然这里代理对象采取的操作不过就是打印出两种信息。