【Java】CGLIB动态代理
目录
一. CGLIB动态代理示例
1. 被代理对象
public class UserServiceImpl {
public void addUser(String name) {
System.out.println("add user into database.");
}
public String getUser(String name) {
System.out.println("getUser from database.");
return name;
}
}
2. 代理工具类
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CGProxy implements MethodInterceptor{
private Object target; // 被代理对象
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy proxy) throws Throwable {
System.out.println("do sth before....");
Object result = proxy.invokeSuper(arg0, arg2);
System.out.println("do sth after....");
return result;
}
public Object getProxyObject(Object target) {
this.target = target;
Enhancer enhancer = new Enhancer();
// 设置父类
enhancer.setSuperclass(this.target.getClass());
// 设置回调(在调用父类方法时,回调 this.intercept())
enhancer.setCallback(this);
// 创建代理对象
return enhancer.create();
}
}
3. 使用代理类
public class CGProxyTest {
public static void main(String[] args){
UserServiceImpl userServiceImpl = new UserServiceImpl(); // 被代理的对象
// 创建代理对象(创建的代理对象可以放在容器中缓存,后续调用时获取即可)
UserServiceImpl proxyObject = (UserServiceImpl) new CGProxy().getProxyObject(userServiceImpl);
proxyObject.getUser("1");
proxyObject.addUser("1");
}
}
5. 执行结果
do sth before....
getUser from database.
do sth after....
do sth before....
add user into database.
do sth after....
二. CGLIB动态代理说明
1. 获取代理对象:CGProxy.getProxyObject
2. 调用代理方法:CGProxy.intercept
3. 原理
- CGLIB是基于继承机制,继承被代理类,所以方法不要声明为final,通过重写父类方法达到增强类的作用
- 底层是基于asm第三方框架,把代理对象类的class文件加载进来,通过修改其字节码生成新的子类来处理
- 生成类的速度慢,但是后续执行类的操作时很快
4. 参考资料
https://www.jianshu.com/p/9a61af393e41?from=timeline&isappinstalled=0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2016-03-17 SqlServer查看对象(表、存储过程、函数)在哪些地方被引用或引用哪些地方
2012-03-17 JavaScript Window对象
2012-03-17 JavaScript内置对象
2011-03-17 Repeater控件的使用 (原样导出和动态显示/隐藏Repeater中的列)