我们仅简单的删除掉了类实现的接口 。就爆出这样严重的错误 。假如我们不想要实现任何接口呢,不想用接口来描述所要代理的方法 。
这个时候,我们最好使用CGLib动态代理,它可以代理没有任何接口的类 。接下来我们就来写这样的一个动态代理 。
代理类 –>
package com.blaze.study.aop.cglib;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class CGLibProxyDemo05 implements MethodInterceptor{@SuppressWarnings("unchecked")public T getProxy(Class> cls){return (T) Enhancer.create(cls,this);}@Overridepublic Object intercept(Object target, Method method, Object[] args, MethodProxy proxy)throws Throwable{operator1();Object result = proxy.invokeSuper(target,args);operator2();return result;}public void operator1(){System.out.println("Operator1");}public void operator2(){System.out.println("Operator2");}}
我们通过提供的接口,调用方法,来完成CGLib的动态代理 。我们通过这样的方式来调用服务 。
使用者 –>
package com.blaze.study.aop.cglib;import com.blaze.study.aop.proxy.Hello;import com.blaze.study.aop.proxy.HelloImp;import com.blaze.study.aop.proxy.WorldImpl;public class CGLibProxyTestDemo05 {public static void main(String[] args) {Hello h = new CGLibProxyDemo05().getProxy(HelloImp.class);h.say("Sherlock");WorldImpl w = new CGLibProxyDemo05().getProxy(WorldImpl.class);w.say("Blaze");}}
结果
在上面的代码中,我们已实现接口的声明删除掉了 。通过程序执行的结果,我们可以清楚的看到CGLib动态代理不仅可以代理动态的有接口的类,也可以代理没有实现任何接口的类 。这是比JDk动态代理进步的地方 。而关于这一块的原理,我们也会用相应的几篇博客一起探索其中的原理 。Flag立在这里 。
总结
【代码篇Java 实现代理模式】通过上面文字的编写,我已经没有力气写总结了 。所以大家自己总结吧 。谢谢大家的支持 。欢迎访问我的个人博客 。
- 【Java】springmvc下载文件时出现Http400错误
- 2019年Java篇:蚂蚁金服、拼多多、字节跳动的面试总结
- 四面阿里Java开发岗,拼多多+携程+蚂蚁金服技术面集合
- 人机对抗代码 五子棋的简单算法——评分法
- java 传绝对路径无效_段刘愚破门被判无效惹争议 鲁能总比分3-4国安无缘前四
- 最后一战手游登陆流程
- 三 你不知道的javaScript读书笔记
- 六 Spring 源码学习扩展功能 上篇
- 蓝屏代码0x000000f4 蓝屏代码0x0000024
- 程序员小姐姐写出代码版《本草纲目》毽子操,刘畊宏回复:很cool!