JDK动态代理模式和CGLIB代理

xiaoxiao2021-02-28  36

本文先举例子:后续跟进讲解内容,参考TOM老师

xiaoming是根据JDK媒婆代理找媳妇,要实现InvocationHandler接口

zhangsan时根据cglib媒婆代理找媳妇,无需实现接口

JDK代理如下:

package jdkProxy; public interface Person { public void findJob(); } package jdkProxy; /** *小明找对象 */ public class XiaoMing implements Person { public void findJob(){ System.out.println("我叫小明,我找对象要求是白富美"); } } package jdkProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * 媒婆代理,需要实现 InvocationHandler */ public class JDKMeiPo implements InvocationHandler { private XiaoMing target; /** * @param target * @return 返回动态代理对象 * @throws Exception */ public Object getInstance(XiaoMing target) throws Exception{ this.target = target; //创建一个动态代理对象,该动态代理实现了interfaces指定的系列接口, // 执行动态代理对象的每个方法时都会被替换成执行InvocationHandler的对象的invoke方法 Object o = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this); return o; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("我是JDK媒婆,请说出你的需求。。。"); //反射执行方法 method.invoke(target,args); System.out.println("现在开始物色"); return null; } } package jdkProxy; /** * 动态代理的测试类 */ public class MainTest { public static void main(String[] args) throws Exception { JDKMeiPo meiPo = new JDKMeiPo(); Person o = (Person)meiPo.getInstance(new XiaoMing()); o.findJob(); } }

输出结果

我是JDK媒婆,请说出你的需求。。。 我叫小明,我找对象要求是白富美 现在开始物色

CGLIB代理如下:

package cglib; public class Zhangsan { public void findLove(){ System.out.println("我是张三,我的要求是钱钱钱要有钱"); } } package cglib; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * Cglib实现的媒婆 */ public class CgLibMeiPo implements MethodInterceptor { public Object getInstance(Class<?> clazz) throws Exception{ Enhancer enhancer = new Enhancer(); //设置代理目标 enhancer.setSuperclass(clazz); //设置回调 enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { //业务的增强 System.out.println("我是CGLIB媒婆,请说出你的需求。。。"); //反射执行方法 methodProxy.invokeSuper(o,objects); System.out.println("现在开始物色"); return null; } } package cglib; public class TestCGLIB { public static void main(String[] args) throws Exception { Zhangsan zs = (Zhangsan)new CgLibMeiPo().getInstance(Zhangsan.class); zs.findLove(); } }

输出结果:

我是CGLIB媒婆,请说出你的需求。。。 我是张三,我的要求是钱钱钱要有钱 现在开始物色

jdk代理源码和手工实现代理需参考TOM老师的代理模式第二讲,后续跟进

转载请注明原文地址: https://www.6miu.com/read-2626303.html

最新回复(0)