代理,说白了就是,你指定写一个Proxy类帮另一个A类干活,但是Proxy类自己并不亲自干这个活,而是通过反射的方式让第三方具有相同功能的类C来干这个活,而Proxy自己在拿到这个c干好活得结果后对这个结果进行一些操作(当然也可以将结果原封不动的直接交给A),然后交给A。下面看一个实例:- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- import java.util.ArrayList;
- import java.util.Collection;
- public class ProxyArrayList_3 {
- public static void main(String[] args) {
- final ArrayList target = new ArrayList();
- Collection proxy = (Collection) getProxy(target);//proxy是ArrayList的代理
- proxy.add(1);
- proxy.add(2);
- proxy.add(3);
- System.out.println(proxy.size());
- System.out.println(proxy.getClass().getName());
- }
- public static Object getProxy(final Object target) {
- Object proxy = Proxy.newProxyInstance(
- target.getClass().getClassLoader(),
- target.getClass().getInterfaces(),
- new InvocationHandler() {
-
- @Override
- //invoke方法中就是对调用C类干活,并对返回的结果进行操作的过程
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- long beginTime = System.currentTimeMillis();
- Object reValue = method.invoke(target, args);//调用C类中的方法干活
- long endTime = System.currentTimeMillis();
- //对结果进行操作:另加的计算方法运行的时间
- System.out.println(method.getName() + "'s ran time is " + (endTime-beginTime));
- return reValue;
- }
- });
- return proxy;
- }
- }
复制代码 |