代码篇 Java 实现代理模式( 三 )


我们仅简单的删除掉了类实现的接口 。就爆出这样严重的错误 。假如我们不想要实现任何接口呢,不想用接口来描述所要代理的方法 。
这个时候,我们最好使用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 实现代理模式】通过上面文字的编写,我已经没有力气写总结了 。所以大家自己总结吧 。谢谢大家的支持 。欢迎访问我的个人博客 。