CGLIB(Code Generation Library)是一个强大的、高性能、高质量的代码生成库,它可以在运行时扩展 Java 类和实现 Java 接口。CGLIB 动态代理是基于继承的方式来实现的,它不需要接口,可以代理普通类。以下是 CGLIB 动态代理的实现原理:
-
继承:CGLIB 动态代理通过继承目标类来创建子类,并在子类中覆盖父类的方法。
-
代码生成:CGLIB 使用 ASM(一个 Java 字节码操作和分析框架)来操作和生成 Java 字节码,生成新的类。
-
方法拦截:CGLIB 提供了
MethodInterceptor
接口,它类似于 JDK 动态代理的InvocationHandler
。用户需要实现这个接口,并在intercept
方法中定义拦截逻辑。 -
创建代理实例:通过使用
Enhancer
类(CGLIB 的类生成器),可以创建一个代理实例。Enhancer
允许设置父类(目标类)、回调(如MethodInterceptor
)等信息,并最终生成一个继承自目标类的代理类的对象。 -
方法调用处理:当调用代理实例上的方法时,CGLIB 会将调用重定向到
MethodInterceptor
实现的intercept
方法。intercept
方法可以做一些额外处理,比如日志记录、权限验证等,然后通过反射调用目标类(父类)中的相应方法。 -
执行目标方法:在
MethodInterceptor
的intercept
方法中,你可以决定是否调用目标类的方法,以及如何调用。通常情况下,你会使用MethodProxy
对象(intercept
方法的一个参数),它提供了invokeSuper
方法来调用父类的原始方法。 -
返回结果:目标方法执行后的返回值可以被返回给代理对象的方法调用者,或者可以返回一个自定义的值。
CGLIB 动态代理的优点是它不需要目标对象实现任何接口,因此非常适用于代理类本身没有实现接口的情况。但是,由于它是通过继承来实现代理的,因此无法对 final
类或 final
方法进行代理。
总的来说,CGLIB 动态代理通过在运行时生成目标类的子类,并在子类中插入自定义的方法拦截逻辑,从而实现对目标类方法的代理。这种方法在不改变原有代码结构的情况下,为在目标对象的方法调用前后添加额外的处理提供了一种强大的方式。
标签:调用,--,spring,代理,目标,intercept,CGLIB,方法 From: https://www.cnblogs.com/xylfjk/p/17977075