proxy 动态代理 面向接口 1必须有接口和实现类 2增强接口中定义的方法 3只能读取接口中方法的上注解
cglib动态代理模式 面向父类
package com.msb.testCglib; import org.junit.Test; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * @Author: Ma HaiYang * @Description: MircoMessage:Mark_7001 */ public class Test1 { @Test public void testCglib(){ Person person =new Person(); // 获取一个Person的代理对象 // 1 获得一个Enhancer对象 Enhancer enhancer=new Enhancer(); // 2 设置父类字节码 enhancer.setSuperclass(person.getClass()); // 3 获取MethodIntercepter对象 用于定义增强规则 MethodInterceptor methodInterceptor=new MethodInterceptor() { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { /*Object o, 生成之后的代理对象 personProxy Method method, 父类中原本要执行的方法 Person>>> eat() Object[] objects, 方法在调用时传入的实参数组 MethodProxy methodProxy 子类中重写父类的方法 personProxy >>> eat() */ Object res =null; if(method.getName().equals("eat")){ // 如果是eat方法 则增强并运行 System.out.println("饭前洗手"); res=methodProxy.invokeSuper(o,objects); System.out.println("饭后刷碗"); }else{ // 如果是其他方法 不增强运行 res=methodProxy.invokeSuper(o,objects); // 子类对象方法在执行,默认会调用父类对应被重写的方法 } return res; } }; // 4 设置methodInterceptor enhancer.setCallback(methodInterceptor); // 5 获得代理对象 Person personProxy = (Person)enhancer.create(); // 6 使用代理对象完成功能 personProxy.eat("包子"); } } class Person { public Person( ) { } public void eat(String foodName) { System.out.println("张三正在吃"+foodName); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了