logo设计网站排行榜,网站开发平台,手机可以使用wordpress,怎样在百度搜到自己的网站文章目录 前言概要SpringBoot中使用小结 前言
当我们需要在Java中实现动态代理时#xff0c;通常会考虑使用 JDK原生动态代理 或者 CGLIB动态代理。 我这里说一下CGLIB动态代理#xff0c;并给出一个例子。
概要
CGLIB#xff08;Code Generation Library#xff09;是一… 文章目录 前言概要SpringBoot中使用小结 前言
当我们需要在Java中实现动态代理时通常会考虑使用 JDK原生动态代理 或者 CGLIB动态代理。 我这里说一下CGLIB动态代理并给出一个例子。
概要
CGLIBCode Generation Library是一个基于字节码生成的类库用于在运行时动态生成类的子类。它常被用于实现基于类的动态代理。这种方式不要求被代理的类必须实现接口因此可以代理没有实现接口的类。
CGLIB的工作原理
CGLIB通过生成目标类的子类来实现动态代理。当需要代理一个类时CGLIB会创建一个该类的子类并在子类中重写需要代理的方法。这允许我们在方法调用前后插入自定义逻辑实现方法的增强。
SpringBoot中使用
第一步导入依赖 dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.1/version/dependency第二步java代码实现
//被代理的类
class OriginalClass {public void doSomething() {System.out.println(原方法);}
}核心逻辑
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 Main {public static void main(String[] args) {// Enhancer用于生成代理类 它是CGLIB库中的一个关键类Enhancer enhancer new Enhancer();// OriginalClass被代理的类(父类)// CGLIB会生成一个OriginalClass的子类作为代理类。enhancer.setSuperclass(OriginalClass.class);// 设置拦截器 拦截器会在代理类的方法调用前后执行一些自定义逻辑//用了java的匿名内部类来创建了一个实现MethodInterceptor接口的对象enhancer.setCallback(new MethodInterceptor() {Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println(原方法: method.getName() 执行前);Object result methodProxy.invokeSuper(o, objects);System.out.println(原方法: method.getName() 执行后);return result;}});// 创建代理对象OriginalClass proxy (OriginalClass) enhancer.create();// 调用代理对象的方法(比原方法多一些功能)proxy.doSomething();}
}
intercept()参数解释 o: 目标对象的实例。 method: 被调用的方法对象。 objects: 方法的参数数组。 methodProxy: 方法的代理对象可以调用父类方法。 methodProxy.invokeSuper()作用调用目标对象的方法methodProxy子类的实例
结果
小结
CGLIB动态代理在许多框架和库中都有广泛应用它是实现AOP面向切面编程的重要基础之一也是许多ORM对象关系映射框架的核心技术之一 有用就点个赞~~~~