Cglib
Cglib方式
jdk自带的代理方式 必须要实现接口,有限制,所以有Cglib方式
原理:通过字节码技术,创建一个目标类的子类,作为代理对象,在子类中拦截目标类中的方法,对方法做一个加强处理
1)创建目标类
1 2 3 4 5 6 7 8 9 | import com.test.staticproxy.IUserService; public class UserService { public void insert() { } } |
2)导入架包
1 2 3 4 5 | <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version> 3.2 . 4 </version> </dependency> |
创建一个代理类生成器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | 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 MyCgLib implements MethodInterceptor { //创建一个代理对象生成器 Enhancer enhancer= new Enhancer(); //返回一个代理对象 public Object getProxy(Class clazz) { //设置目标对象(目标对象是代理对象的父类) enhancer.setSuperclass(clazz); //设置回调函数 enhancer.setCallback( this ); //通过字节码技术创建一个代理对象 返回 return enhancer.create(); } //方法拦截 @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { //方法加强 System.out.println( "拦截目标方法后 可以自己加强方法的内容" ); //调用代理对象的父类中同名的方法 Object result= methodProxy.invokeSuper(o,objects); //方法加强 System.out.println( "拦截目标方法后 可以自己加强方法的内容2" ); return result; } } |
5)使用
1 2 3 4 5 6 7 8 9 10 11 12 | @Test public void fun() { //创建代理类生成器对象 MyCgLib myCgLib= new MyCgLib(); // 创建一个代理对象 赋值给目标对象类型 或 目标对象类型的接口 UsersService userService=(UsersService)myCgLib.getProxy(UsersService. class ); userService.add(); } |
结果
拦截目标方法后 可以自己加强方法的内容 添加 拦截目标方法后 可以自己加强方法的内容CGlib
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)