JAVA设计模式之CGLIB动态代理

JDK动态代理是jdk提供的代理技术,需要借助接口才能使用,在一些不能提供接口的环境,我们要想使用代理模式,则需要使用第三方代理技术------CGLIB动态代理,它的优势在于不需要对它提供接口,只需要一个非抽象类就能实现动态代理

    准备工作

由于CGLIB是第三方技术,所以需要我们先导入CGLIB的第三方jar包,我使用的版本是cglib-3.2.5.jar

在IDEA中点击File--->Project Structure--->Dependencies--->

Add--->JARs or directories--->选择要添加的jar包的路径并选中,点击OK--->Apply--->OK

    编写非抽象类

public class cglibExample { public void sayHello(){ System.out.println("HelloWorld-----真实对象方法"); } }

    编写代理类

实现MethodInterceptor 接口里的intercept方法,在intercept编写代理逻辑方法

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 cglibProxyExample implements MethodInterceptor { /** * 生成CGLIB代理对象 * @param c 被代理类 * @return 返回代理对象 */ public Object getProxy(Class c) { //CGLIB enhancer增强类对象 Enhancer enhancer = new Enhancer(); // 设置增强类型,参数为被代理类 enhancer.setSuperclass(c); //设置代理对象为当前对象 enhancer.setCallback(this); //生成并返回代理对象 return enhancer.create(); } /** * 代理逻辑方法 * 生成CGLIB代理对象 * @param o 代理对象 * @param method 真实对象方法 * @param params 方法参数 * @param methodProxy 代理对象方法 * @return 返回代理结果 */ @Override public Object intercept(Object o, Method method, Object[] params, MethodProxy methodProxy) throws Throwable { System.out.println("调用真实对象前"); Object obj = methodProxy.invokeSuper(o, params); System.out.println("调用真实对象后"); return obj; } }

    编写测试类

public class testCglib { public static void main(String[] args){ cglibProxyExample cglibProxyExample = new cglibProxyExample();

//获取代理对象 cglibExample proxy = (cglibExample)cglibProxyExample.getProxy(cglibExample.class);

//通过代理对象调用真实对象的方法 proxy.sayHello(); } }

    运行结果
    异常处理

在运行项目时出现异常报错,报错信息如下所示

这个异常说明的很清楚,因为使用了CGlib的Enhancer类,这个类用于为非接口类型创建一个Java代理,类里面使用了org.objectweb.asm.Type。ASM是一个字节码解析的工具,导入ASM的jar即可解决该问题,导入asm-5.0.4步骤同导入cglib-3.2.5.jar。

经验分享 程序员 微信小程序 职场和发展