17

来源:互联网 发布:知乎 枪声俱乐部 编辑:程序博客网 时间:2024/04/29 08:45
package com.haizhitao.dynamicproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.List;import java.util.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));}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: " + method);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);}}//output://$Proxy0//before calling: public abstract boolean java.util.List.add(java.lang.Object)//New//after calling: public abstract boolean java.util.List.add(java.lang.Object)//before calling: public abstract boolean java.util.List.add(java.lang.Object)//York//after calling: public abstract boolean java.util.List.add(java.lang.Object)//before calling: public java.lang.String java.lang.Object.toString()//after calling: public java.lang.String java.lang.Object.toString()//[New, York]//before calling: public abstract java.lang.Object java.util.List.remove(int)//0//after calling: public abstract java.lang.Object java.util.List.remove(int)//before calling: public java.lang.String java.lang.Object.toString()//after calling: public java.lang.String java.lang.Object.toString()//[York]