一、首先说一下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动态代理原理分析
# 拦截器
# 给大家
# 能对
# 回调
# 自己的
# 的是
# 在这个
# 子类
# 对你
# 有一定
# 很高
# 希望能
# 不受
# 可以看到
# 将被
# 实体类
# 它可以
# 只在
# 这篇
# 这在
相关文章:
家具网站制作软件,家具厂怎么跑业务?
网站制作企业,网站的banner和导航栏是指什么?
如何在自有机房高效搭建专业网站?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
C#如何使用XPathNavigator高效查询XML
广州商城建站系统开发成本与周期如何控制?
南京网站制作费用,南京远驱官方网站?
模具网站制作流程,如何找模具客户?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
制作网站的公司有哪些,做一个公司网站要多少钱?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
江苏网站制作公司有哪些,江苏书法考级官方网站?
如何在万网主机上快速搭建网站?
如何快速查询网站的真实建站时间?
建站之星好吗?新手能否轻松上手建站?
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何撰写建站申请书?关键要点有哪些?
详解jQuery中基本的动画方法
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
如何使用Golang安装API文档生成工具_快速生成接口文档
家庭服务器如何搭建个人网站?
盘锦网站制作公司,盘锦大洼有多少5G网站?
建站主机选购指南与交易推荐:核心配置解析
Swift中switch语句区间和元组模式匹配
外贸公司网站制作,外贸网站建设一般有哪些步骤?
建站org新手必看:2024最新搭建流程与模板选择技巧
建站之星备案是否影响网站上线时间?
宝塔建站后网页无法访问如何解决?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
免费视频制作网站,更新又快又好的免费电影网站?
如何挑选优质建站一级代理提升网站排名?
济南企业网站制作公司,济南社保单位网上缴费步骤?
制作网站的模板软件,网站怎么建设?
如何在云主机上快速搭建网站?
免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?
常州企业网站制作公司,全国继续教育网怎么登录?
定制建站哪家更专业可靠?推荐榜单揭晓
如何通过商城自助建站源码实现零基础高效建站?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
如何在阿里云通过域名搭建网站?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
制作网站的基本流程,设计网站的软件是什么?
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
如何获取免费开源的自助建站系统源码?
寿县云建站:智能SEO优化与多行业模板快速上线指南
建设网站制作价格,怎样建立自己的公司网站?
建站上市公司网站建设方案与SEO优化服务定制指南
魔毅自助建站系统:模板定制与SEO优化一键生成指南
*请认真填写需求信息,我们会在24小时内与您取得联系。