jdk动态代理和cglib动态代理
jdk动态代理
下面将代码实例展示
package cn.mode.proxy; /** * 接口类 * @author zzh * */ public interface People { void say(int i); }package cn.mode.proxy; /** * 实现类 * @author zzh * */ public class Girl implements People { @Override public void say(int i) { if (i == 1) { System.out.println("我在吃饭"); } else { System.out.println("我什么事都没做"); } } }package cn.mode.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.Date; /** * 代理类 * @author zzh * */ public class SayHandler implements InvocationHandler { private Object obj; //构造方法传入代理 public SayHandler(Object obj) { this.obj = obj; } public SayHandler() { } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("开始代理,时间:" + new Date()); Object result = method.invoke(obj, args); System.out.println("代理结束"); return result; } }package cn.mode.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; /** * 测试类 * @author zzh * */ public class Test { public static void main(String[] args) { People people = new Girl(); //代理类 InvocationHandler handler = new SayHandler(people); //代理对象 People proxy = (People) Proxy.newProxyInstance(People.class.getClassLoader(), new Class[]{People.class}, handler); proxy.say(1); } }输出:
开始代理,时间:Sun Mar 27 21:24:58 CST 2016
我在吃饭
代理结束
cglib动态代理
看一个例子
package cn.mode.proxy.cglib; public class People { public void say() { System.out.println("吃吃"); } }package cn.mode.proxy.cglib; public class Girl extends People { @Override public void say() { System.out.println("我在吃饭"); } }package cn.mode.proxy.cglib; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class PeopleProxy implements MethodInterceptor { private Enhancer enhancer = new Enhancer(); public Object getProxy(Class<?> clazz){ //设置需要创建子类的类 enhancer.setSuperclass(clazz); //回调 enhancer.setCallback(this); //通过字节码技术动态创建子类实例 return enhancer.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("代理前"); Object object = proxy.invokeSuper(obj, args); System.out.println("代理后"); return object; } }package cn.mode.proxy.cglib; public class Test { public static void main(String[] args) { PeopleProxy proxy = new PeopleProxy(); People people = (People) proxy.getProxy(Girl.class); people.say(); } }输出:
代理前
我在吃饭
代理后
对比
谁与争锋,JDK动态代理大战CGLib动态代理jdk动态代理和cglib动态代理
代理模式-动态代理详解(JDK动态代理和CGLIB动态代理)jdk cglib动态代理
jdk动态代理和cglib动态代理cglib代理和jdk动态代理区别
JDK动态代理和CGLib动态代理的对比cglib代理和jdk动态代理区别
JDK动态代理和CGlib动态代理的选择cglib代理和jdk动态代理区别
jdk动态代理和cglib动态代理的原理分析cglib代理和jdk动态代理区别
代理模式之静态代理,JDK动态代理和cglib动态代理jdk cglib动态代理
java中的静态代理、jdk动态代理和cglib动态代理jdk cglib动态代理
动态代理:JDK动态代理和CGLIB代理的区别cglib代理和jdk动态代理区别