Java CGLib动态代理机制(全面解析)
发布时间 - 2026-01-11 02:38:22 点击率:次一、首先说一下JDK中的动态代理:

JDK中的动态代理是通过反射类Proxy以及InvocationHandler回调接口实现的
但是,JDK中所要进行动态代理的类必须要实现一个接口,也就是说只能对该类所实现接口中定义的方法进行代理,这在实际编程中具有一定的局限性,而且使用反射的效率也并不是很高。
二、使用CGLib实现:
使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。
下面,将通过一个实例介绍使用CGLib实现动态代理。
1、被代理类:
首先,定义一个类,该类没有实现任何接口,包含两个方法。
public class ConcreteClassNoInterface {
public String getConcreteMethodA(String str){
System.out.println("ConcreteMethod A ... "+str);
return str;
}
public int getConcreteMethodB(int n){
System.out.println("ConcreteMethod B ... "+n);
return n+10;
}
}
2、拦截器:
定义一个拦截器。在调用目标方法时,CGLib会回调MethodInterceptor接口方法拦截,来实现你自己的代理逻辑,类似于JDK中的InvocationHandler接口。
public class ConcreteClassInterceptor implements MethodInterceptor{
public Object intercept(Object obj, Method method, Object[] arg, MethodProxy proxy) throws Throwable {
System.out.println("Before:"+method);
Object object=proxy.invokeSuper(obj, arg);
System.out.println("After:"+method);
return object;
}
}
参数:Object为由CGLib动态生成的代理类实例,Method为上文中实体类所调用的被代理的方法引用,Object[]为参数值列表,MethodProxy为生成的代理类对方法的代理引用。
返回:从代理实例的方法调用返回的值。
其中,proxy.invokeSuper(obj,arg):
调用代理类实例上的proxy方法的父类方法(即实体类ConcreteClassNoInterface中对应的方法)
在这个示例中,只在调用被代理类方法前后各打印了一句话,当然实际编程中可以是其它复杂逻辑。
3、生成动态代理类:
Enhancer enhancer=new Enhancer(); enhancer.setSuperclass(ConcreteClassNoInterface.class); enhancer.setCallback(new ConcreteClassInterceptor()); ConcreteClassNoInterface ccni=(ConcreteClassNoInterface)enhancer.create();
这里Enhancer类是CGLib中的一个字节码增强器,它可以方便的对你想要处理的类进行扩展,以后会经常看到它。
首先将被代理类ConcreteClassNoInterface设置成父类,然后设置拦截器ConcreteClassInterceptor,最后执行enhancer.create()动态生成一个代理类,并从Object强制转型成父类型ConcreteClassNoInterface。
最后,在代理类上调用方法:
ccni.getConcreteMethodA("shensy");
ccni.getConcreteMethodB(0);
查看控制台输出:
Before :public java.lang.String generic.cglib.proxy.ConcreteClassNoInterface.getConcreteMethodA(java.lang.String) ConcreteMethod A ... shensy After :public java.lang.String generic.cglib.proxy.ConcreteClassNoInterface.getConcreteMethodA(java.lang.String) Before :public int generic.cglib.proxy.ConcreteClassNoInterface.getConcreteMethodB(int) ConcreteMethod B ... 0 After :public int generic.cglib.proxy.ConcreteClassNoInterface.getConcreteMethodB(int)
可以看到,拦截器在调用被代理类方法前后都执行了print操作。
以上这篇Java CGLib动态代理机制(全面解析)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# java
# 动态代理
# cglib
# Java基础之动态代理Cglib详解
# 详解Java Cglib动态代理
# Java使用JDK与Cglib动态代理技术统一管理日志记录
# JAVA中的静态代理、动态代理以及CGLIB动态代理总结
# java 中动态代理(JDK
# cglib)实例代码
# 深入理解java动态代理的两种实现方式(JDK/Cglib)
# Java 动态代理与CGLIB详细介绍
# 浅谈Java代理(jdk静态代理、动态代理和cglib动态代理)
# java动态代理和cglib动态代理示例分享
# java动态代理(jdk与cglib)详细解析
# Java cglib动态代理原理分析
# 拦截器
# 给大家
# 能对
# 回调
# 自己的
# 的是
# 在这个
# 子类
# 对你
# 有一定
# 很高
# 希望能
# 不受
# 可以看到
# 将被
# 实体类
# 它可以
# 只在
# 这篇
# 这在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
JavaScript中的标签模板是什么_它如何扩展字符串功能
Laravel怎么判断请求类型_Laravel Request isMethod用法
青岛网站建设如何选择本地服务器?
英语简历制作免费网站推荐,如何将简历翻译成英文?
Laravel如何使用Blade组件和插槽?(Component代码示例)
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
如何在景安云服务器上绑定域名并配置虚拟主机?
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
如何自定义建站之星网站的导航菜单样式?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
如何在阿里云购买域名并搭建网站?
如何用wdcp快速搭建高效网站?
文字头像制作网站推荐软件,醒图能自动配文字吗?
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
详解Oracle修改字段类型方法总结
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
轻松掌握MySQL函数中的last_insert_id()
如何在局域网内绑定自建网站域名?
智能起名网站制作软件有哪些,制作logo的软件?
如何在建站之星绑定自定义域名?
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
如何在腾讯云服务器上快速搭建个人网站?
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
javascript中闭包概念与用法深入理解
Laravel storage目录权限问题_Laravel文件写入权限设置
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
高防服务器如何保障网站安全无虞?
免费视频制作网站,更新又快又好的免费电影网站?
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
Laravel如何处理表单验证?(Requests代码示例)
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
网站图片在线制作软件,怎么在图片上做链接?
C++时间戳转换成日期时间的步骤和示例代码
如何快速打造个性化非模板自助建站?
简单实现jsp分页
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
重庆市网站制作公司,重庆招聘网站哪个好?
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
如何在Windows服务器上快速搭建网站?
如何破解联通资金短缺导致的基站建设难题?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
上一篇:linux重装怎么格式化硬盘
上一篇:linux重装怎么格式化硬盘

