Proxy只能代理接口,不能代理类。
网上好多都是以代理Connection接口为例子的。不过讲的很不清楚。
现在,我们来代理List接口,并截住List的toString()方法,做一下特殊的处理。
要想实现接口的代理,那么我们需要实现InvocationHandler接口的invoke方法。
以下是用来测试的类TestJava
import java.util.List;
public class JavaTest {
public static void main(String[] args) {
ListFactory lf = new ListFactory();
List mylst = lf.getList();
System.out.println(mylst.toString());
}
}
下面就是实现了InvocationHandler接口的ListFactory类,我们取得List的实例,就是通过这个类来获取。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
public class ListFactory implements InvocationHandler {
private final String TOSTRING_METHOD_NAME = "toString";
/* 定义一个List的实例,并初始化。*/
private List myList = new ArrayList();
public ListFactory() {
}
/**
* 取得List实例的方法。
*/
public List getList() {
/* 接管myList,也便截住myList(List接口)的方法。*/
List lst = (List) Proxy.newProxyInstance(myList.getClass()
.getClassLoader(), myList.getClass().getInterfaces(), this);
return lst;
}
/**
* 实现InvocationHandler接口的invoke方法。
*/
public Object invoke(Object pxy, Method mthd, Object[] args)
throws Throwable {
Object obj = null;
/* 覆盖List的toString()方法。*/
if (TOSTRING_METHOD_NAME.equals(mthd.getName())) {
obj = "---------toString method is recovered---------";
} else {
obj = mthd.invoke(myList, args);
}
return obj;
}
}
以下是测试类的运行结果:
---------toString method is recovered---------