动态代理
动态代理#
动态代理是指,程序在整个运行的过程中根本不存在目标的代理类,目标对象的代理对象只是由代理生成工具(不是真是定义的类)在程序运行时由JVM 根据反射等机制动态生成的。代理对象与目标对象的代理关系在程序运行时才确定。
1. JDK动态代理#
动态代理的实现方式常用的有两种:使用JDK 的Proxy,与通过CGLIB生成代理。JDK的动态要求目标对象必须实现接口,这是java设计上的要求。从jdk1.3以来,java语言通过java.lang.reflect包提供的三个类支持代理模式Proxy,Method和InvocationHandler.
2. CGLIB动态代理#
CGLIB(Code Generation Library)是一个开源项目。是一个强大的,高性能,高质量的Code生成的类库,它可以在运行期扩展java类与实现java接口。它广泛的被许多AOP 的框架使用。如:Spring AOP.
使用 JDK 的 Proxy 实现代理,要求目标类与代理实现相同的接口。若目标类不存在接口,则无法实现该方式。但对于无接口的类,要为其创建动态代理,就要使用CGLIB来实现。
3. 动态代理的作用#
1)在目标类源代码不改变的情况下,增强功能。
2)减少代码的重复。
3)专注业务逻辑代码。
4)解耦合,让你的业务功能和日志,事务和非业务功能分离。
应用代码#
package org.example.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class UserDaoEnhance implements InvocationHandler {
//目标对象
Object target = null;
public UserDaoEnhance(Object target) {
this.target = target;
}
//通过代理对象执行方法时,会调用这个invoke方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("执行前增强.....");
//执行目标类方法,通过Method类实现
Object result = method.invoke(target, args);
System.out.println("执行后增强.....");
//目标方法的执行结果
return result;
}
}
- 使用JDK中类Proxy,创建代理对象,实现创建对象的能力。
@Test
public void test4(){
//创建目标对象
UserDao target = new UserDaoImpl();
//创建InvocationHandler对象
InvocationHandler handler = new UserDaoEnhance(target);
//使用Proxy创建代理
UserDao userDao = (UserDao) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler);
//通过代理执行方法,调用handler中的invoke方法
userDao.run();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理