Proxy 代理类!!!
通过代理动态生成字节码,必须为它提供一个或多个要实现的接口。。。。 和匿名类有点相似的感觉!!
调用Proxy的静态方法getProxyClass获得创建的字节码Class类型,,这个方法接受两个参数,一个类加载器,一个所要实现的接口的可变参数。。
Proxy.getProxyClass(Runnable.class.getClassLoader(),Runnable.class)
以及newProxyInstance方法,,,比上个方法多一个参数InvocationHanlder,,,,,相同于上个方法,也就是说用代理创建出来的字节码都包含一个构造函数接受这个类型的一个参数!!
package proxyTest; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Collection; import java.util.HashMap; import java.util.Map; public class MyProxy { public static void main(String[] args) { Map map = (Map)Proxy.newProxyInstance( Map.class.getClassLoader(), new Class[]{Map.class}, new InvocationHandler(){ HashMap map = new HashMap(); @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object obj = method.invoke(map, args); return obj; } } ); map.put("zhangsan", 12); map.put("lisi", 18); map.put("wangwu", 50); System.out.println(map.size()); } }
将获取代理提取为方法,,,传递封装了需要添加其他功能的对象和需要被代理的目标对象进入当参数!!实现了一个小小的代理框架,,给我什么对象,和需要添加的功能,就跟给你创建出你想要的代理对象····神奇啊!有木有,,,有木有!!!!
package proxyTest; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; public class MyProxy { public static void main(String[] args) { final HashMap map = new HashMap(); final Advice advice = new Advice() { private long beginTime; @Override public void endTime(Method me) { System.out.println(me.getName()+"执行了"+ (System.currentTimeMillis()-beginTime)); } @Override public void beginTime(Method me) { beginTime = System.currentTimeMillis(); } }; Map list = (Map)getProxy(map,advice); list.put("zhangsan", 12); list.put("lisi", 18); list.put("wangwu", 50); System.out.println(list.size()); } public static Object getProxy(final Object obj,final Advice ad){ Object pro = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler(){ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { ad.beginTime(method); Object me = method.invoke(obj, args); ad.endTime(method); return me; } }); return pro; } }
就这样实现了AOP的思想,,,其实我用装饰模式也能实现~!! HOHO··