CGLIB动态代理

本文深入探讨了CGLIB动态代理的工作原理,包括如何通过创建Enhancer实例来扩展Java类,设置拦截器和过滤器以实现特定方法的拦截与定制,以及在运行时生成代理对象子类的过程。通过具体的步骤演示,帮助开发者理解并掌握CGLIB动态代理的核心概念与应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDK的动态代理对象,需要一个或多个接口

CGLIB:不需要代理对象有接口。可在运行期间扩展JAVA类,实现JAVA接口

CGLIB是以拦截器方式进行代理,拦截的是某个类的某些方法,如果某些方法不想被拦截,可使用过滤进行过滤拦截。

步骤:

创建Enhancer的实例,Enhancer是一个增强对象,他可以在运行期间创建代理对象的子类。

设置Enhancer的属性。

setSuperclass(Class clazz),设置被代理对象的父类;

setCallback(Callback c),设置拦截类

setCallbacks(Callback[] c).设置一个拦截器类数组(多个拦截器)

setCallbackFilter(CallbackFilter f):设置过滤器

create():返回这个代理后的对象

写拦截器,实现MethodInterceptor接口,覆写intercept()方法

    public Object intercept(Object obj, Method method, Object[]               args, MethodProxy proxy) throws Throwable {
System.out.println(method.getName() + " 被代理后调用了");
return proxy.invokeSuper(obj, args);
}


类似JDK的代理方式,这里是所有被过滤下来的方法所要走过的地方。

编写一个过滤类,实现CallbackFilter接口,并覆写accept()方法,返回一个int值,这个值,最小为0,拦截器可能有N个,设置在enhancer的setCallbacks里面了,这里返回的int就是设置进去的下标,从0开始。另外,CGLIB有个默认的构造器,NoOP.INSTANCE,这个拦截器什么都不干。



总结:整个过程,CGLIB在运行期间,由enhancer.create生成一个被代理对象的子类。

并根据CallbackFilter的accept方法,覆写了被代理对象中的所有方法,然后去执行MethodInterceptor的intercept方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值