java动态代理,proxy和cglib
2014-03-13 11:24
555 查看
java的proxy需要代理对象实现接口,cglib则不需要。
所以有人说spring的aop对于有接口的就用java的proxy,否则就用cglib。
java proxy
cglib
所以有人说spring的aop对于有接口的就用java的proxy,否则就用cglib。
java proxy
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyTest { public static void main(String[] args) { Worker1 w1 = new Worker1(); WorkerInvocationHandler handler = new WorkerInvocationHandler(); handler.instance = w1; Class<?> c = w1.getClass(); Worker w = (Worker)Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), handler); w.work(); System.out.println("------------"); Worker2 w2 = new Worker2(); handler.instance = w2; c = w2.getClass(); w = (Worker)Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), handler); w.work(); } } interface Worker { void work(); } class Worker1 implements Worker { @Override public void work() { System.out.println("worker1 working..."); } } class Worker2 implements Worker { @Override public void work() { System.out.println("worker2 working..."); } } class WorkerInvocationHandler implements InvocationHandler { Object instance; @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before invoke..."); Object result = method.invoke(instance, args); System.out.println("after invoke..."); return result; } }
cglib
import java.lang.reflect.Method; import net.sf.cglib.proxy.Callback; import net.sf.cglib.proxy.CallbackFilter; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import net.sf.cglib.proxy.NoOp; public class ProxyTest { public static void main(String[] args) { String name = "xx"; Factory.getWorker().work(name); Factory.getWorker().x(); System.out.println("--------"); CglibProxyFactory.getWorker().work(name); CglibProxyFactory.getWorker().x(); } } class Worker { void work(String name) { System.out.println(name + " is working..."); } void x() { System.out.println("xxxx"); } } class Factory { static Worker getWorker() { return new Worker(); } } class CglibProxyFactory { static Worker getWorker() { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(Worker.class); enhancer.setCallbacks(new Callback[]{new CglibProxy(), NoOp.INSTANCE}); enhancer.setCallbackFilter(new CallbackFilter() { @Override //返回Callbacks的索引 public int accept(Method method) { //对x方法不拦截 if (method.getName().equals("x")) return 1; return 0; } }); return (Worker)(enhancer.create()); } } class CglibProxy implements MethodInterceptor { @Override public Object intercept(Object o, Method m, Object[] os, MethodProxy mp) throws Throwable { System.out.println("before invoke..."); Object result = mp.invokeSuper(o, os); System.out.println("after invoke..."); return result; } }
相关文章推荐
- eclipse快捷键大全
- javaWeb Servlet的Filter的使用
- Spring系列:Spring实现HelloWord
- cmd设置Jdk环境变量并执行java文件
- java 解析webservice 中的soapheader
- [转]创建节约内存的JavaBean
- java.lang.NullPointerException: Expected timestamp in the Flume event headers, but it was null
- javascritp第十课:面向对象
- Java7编程高手进阶读书笔记—集合框架
- java 三大框架
- Java设计模式之工厂模式
- Java中的equals()和hashCode()契约
- Struts2入门一搭建开发环境及相应案例
- 深入java虚拟机(2)
- 类加载器的工作原理
- 2011级java第一周(春)项目---求2个整数的最大公约数
- Java解析JSON
- java操作sql
- iOS客户端、java服务器的通信用RSA加密
- java io 转