本文共 1973 字,大约阅读时间需要 6 分钟。
在软件开发中,动态代理是一种常用的技术,它允许在程序运行时为目标对象创建代理类,以实现对目标对象的控制和扩展。其中,CGLib动态代理是一种基于字节码技术的动态代理实现方式,提供了高度的灵活性和对方法拦截的强大能力。
CGLib动态代理通过生成目标类的子类,拦截并重写目标类的所有方法。在生成的子类中,通过 JNI(本地方法接口)实现对目标方法的动态调用,并在调用过程中可以插入自定义的逻辑。这种方式能够在不修改目标类的前提下,动态地为目标类添加功能或改变行为。
定义一个普通的 Java 类作为目标类:
package com.cglibdynamicproxy.service;public class AgentTarget { public void proxyMethod() { System.out.println("被代理的方法执行了"); }} 创建一个拦截器类,继承 net.sf.cglib.proxy.MethodInterceptor 接口,并实现 intercept 方法。拦截器类的作用是拦截目标类的方法调用,并在适当的位置添加自定义逻辑:
package com.cglibdynamicproxy.cglib;import java.lang.reflect.Method;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class CglibMethodInterceptor implements MethodInterceptor { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("before"); Object result = null; try { result = proxy.invokeSuper(obj, args); } catch (Exception e) { System.out.println("异常处理:" + e.getMessage()); throw e; } finally { System.out.println("after"); } return result; }} 在项目中添加CGLib依赖,确保类loading能够正确进行。在 pom.xml 中添加依赖:
net.sf.cglib cglib 3.2.5
使用 Enhancer 工厂类创建动态代理。设置代理目标类和拦截器回调函数,然后创建代理对象:
public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(AgentTarget.class); enhancer.setCallback(new CglibMethodInterceptor()); AgentTarget childAgentTarget = (AgentTarget) enhancer.create(); childAgentTarget.proxyMethod();} 通过查看生成的 AgentTarget$$EnhancerByCGLIB$$303de0ca 类,可以看到代理类是如何继承和重写目标类方法的。你可以看到生成类中包含了目标类的所有方法,以及拦截器在方法调用时所执行的逻辑。
通过以上步骤,可以清晰地看到CGLib动态代理的工作原理,以及它是如何在无修改目标类的情况下,动态地拦截和执行目标方法的。这种方法能够为系统提供灵活的功能扩展,同时保持目标类的原有功能不变。
转载地址:http://xompz.baihongyu.com/