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组件介绍之七)