动态代理
常用的动态代理技术有两种:
1、JDK代理
2、Cglib代理
JDK代理
要求被代理对象必须有接口,动态代理生成的实际为接口的子类,所以在接收动态代理类是要用父接口。
public class JdkProxyFactory implements InvocationHandler { private Object target; public JdkProxyFactory(Object target){ this.target = target; } public Object getProxyObject(){ //实现第三个参数的invoke方法 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } //被代理对象方法执行时调用 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("方法执行前增强"); Object object = method.invoke(target, args); System.out.println("方法执行后增强"); if(object == null ){ object = ""; } System.out.println("将null值变为空串"); return object; //返回方法的返回值 } }
Cglib代理
第三方代理框架,已经整合进spring-core包下,被代理对象无需实现接口,代理生成的类为被代理对象的子类。
public class CglibProxyFactory implements MethodInterceptor { private Object target; public CglibProxyFactory(Object target){ this.target = target; } public Object getProxyObject(){ //实例化cglib增强器 Enhancer enhancer = new Enhancer(); //设置两个属性 //1、要代理的类型 enhancer.setSuperclass(target.getClass()); //2、设置回调方法 enhancer.setCallback(this); return enhancer.create(); } /** * 被代理对象方法执行时调用 * @param proxy 生成的代理对象 * @param method 执行的目标对象的方法 * @param args 方法参数 * @param methodProxy 代理后的方法 * @return * @throws Throwable */ @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("记录日志了。。"); // return method.invoke(target, args); // return methodProxy.invoke(target, args); // return methodProxy.invokeSuper(proxy, args); // Object o = method.invoke(target, args); // Object o = methodProxy.invoke(target, args); Object o = methodProxy.invokeSuper(proxy, args); System.out.println(methodProxy.getSignature()); System.out.println(Arrays.toString(methodProxy.getSignature().getArgumentTypes())); System.out.println(methodProxy.getSignature().getName()); System.out.println(methodProxy.getSignature().getReturnType()); System.out.println(methodProxy.getSignature().getDescriptor()); System.out.println(methodProxy.getSuperName()); System.out.println("记录日志结束。。。"); return o; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)