JDK代理与Cglib代理实现分析
作者:admin发布时间:2020-09-11分类:Java技术浏览:1675
JDK代理AOP实现
java.lang.reflect.Proxy,
代理提供用于创建动态代理类和实例的静态方法。只能针对接口创建代理
newProxyInstance()
返回一个指定接口的代理类实例,该接口可以将方法调用分配到指定的调用处理程序
(详见api文档)(广州计算机培训转)
java.lang.reflect.InvocationHandler,
InvocationHandler是代理实例的调用处理程序实现的接口。
invoke()
在与代理关联的代理实例上调用方法时,将在调用处理程序上调用此方法。
动态代理的使用代码示例如下:
1个公共静态void main(String [] args){
2
3 InvocationHandler ih = new InvocationHandler(){
4
5个公共对象调用(对象代理,方法方法,对象[]参数)
6投掷{
7 //拦截方法处理
8返回null;
9}
10
11};
12
13个Class []接口=新的Class [] {BankAccount.class};
14
15 BankAccount bankAccount =(BankAccount)Proxy.newProxyInstance(ProxyTest
16 .class.getClassLoader(),interfaces,ih);
17}
18
下面是动态代理生成的代码对应(通过反编译工具对字节码进行处理)
接口代码:
1个公共接口BankAccount {
2
3布尔存款(BigDecimal货币);
4
5布尔取款(BigDecimal money);
6
7字符串getName();
8
9字符串getId();
10}
11
动态代理生成的字节码(反编译后的Java代码)
1个公开最终类BankAccount $ 1扩展了Proxy实施BankAccount {
2个私有静态方法m6;// getId
3私有静态方法m4;//退出
4个私有静态方法m5;// getName
5个私有静态方法m2;// toString
6私有静态方法m0; // hashCode
7个私有静态方法m3;//存入
8个私有静态方法m1;// 等于
9
10公共BankAccount $ 1(InvocationHandler ih){
11超级(ih);
12}
13
14个公共最终字符串getId(){
15试试{
16 return(String)this.h.invoke(this,m6,null);
17} catch(RuntimeException e){
18掷e;
19} catch(Throwable t){
20抛出新的UndeclaredThrowableException(t);
21}
22}
23
24 public final boolean withdraw(BigDecimal paramBigDecimal){
25试试{
26 return((Boolean)this.h.invoke(this,m4,
27个新的Object [] {paramBigDecimal}))。booleanValue();
28} catch(RuntimeException e){
29掷e;
30} catch(Throwable t){
31抛出新的UndeclaredThrowableException(t);
32}
33}
34
35 public final String getName(){
36试试{
37 return(String)this.h.invoke(this,m5,null);返回
38} catch(RuntimeException e){
39掷e;
40} catch(Throwable t){
41抛出新的UndeclaredThrowableException(t);
42}
43}
44
45 public final String toString(){
46试试{
47 return(String)this.h.invoke(this,m2,null);复制代码
48} catch(RuntimeException localRuntimeException){
49抛出localRuntimeException;
50} catch(Throwable t){
51抛出新的UndeclaredThrowableException(t);
52}
53}
54
55 public final int hashCode(){
56试试{
57 return((Integer)this.h.invoke(this,m0,null))。intValue();复制代码
58} catch(RuntimeException e){
59掷e;
60} catch(Throwable t){
61抛出新的UndeclaredThrowableException(t);
62}
63}
64
65个公共最终布尔值存款(BigDecimal paramBigDecimal){
66试试{
67 return((Boolean)this.h.invoke(this,m3,
68个新的Object [] {paramBigDecimal}))。booleanValue();
69} catch(RuntimeException localRuntimeException){
70抛出localRuntimeException;
71} catch(Throwable localThrowable){
72抛出新的UndeclaredThrowableException(localThrowable);
73}
74}
75
76静态{
77试试{
78平方米= Class.forName(“ BankAccount”)。getMethod(“ getId”,新Class [0]);
79平方米= Class.forName(“ BankAccount”)。getMethod(“ withdraw”,
80新的Class [] {Class.forName(“ java.math.BigDecimal”)});
81平方米= Class.forName(“ BankAccount”)
82 .getMethod(“ getName”,new Class [0]);
83平方米= Class.forName(“ java.lang.Object”)。getMethod(“ toString”,
84个新Class [0]);
85 m0 = Class.forName(“ java.lang.Object”)。getMethod(“ hashCode”,
86个新Class [0]);
87立方米= Class.forName(“ BankAccount”)。getMethod(“ deposit”,
88 new Class [] {Class.forName(“ java.math.BigDecimal”)});
89平方米= Class.forName(“ java.lang.Object”)。getMethod(“ equals”,
90 new Class [] {Class.forName(“ java.lang.Object”)});
91} catch(NoSuchMethodException e){
92抛出新的NoSuchMethodError(e.getMessage());
93} catch(ClassNotFoundException e){
94抛出新的NoClassDefFoundError(e.getMessage());
95}
96}
97}
98
从动态代理生成的代码可以分析得到,所有的方法的调用,都会调用InvokeHanlder接口的实现类的invoke方法,并把实际调用的反射相关信息作为参数传递给invoke方法。
Cglib代理AOP实现(广州计算机培训转)
cglib是一个开源项目!是一个强大的,高性能,可以扩展的代码生成类库,它可以在运行期扩展Java类与实现Java接口。Spring可以通过该项目实现AOP的功能封装。
CGLIB包的压缩是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。通过使用CGLIB来为那些没有接口的类创建代理对象。
Cglib的代理与JDK代理还是有一定的相似的,下面的例子,给大家一个基本的演示
1个公共类SimpleBean {
2
3 public void hello(){
4 System.out.println(“ hi matthew!”);
5}
6}
Cglib代理后(只称为了部分核心反编译后的Java代码)
1类SimpleBean $$ EnhancerByCGLIB $$ 4c4a66a扩展了SimpleBean {
2个私有静态最终方法CGLIB $ hello $ 0 $ Method;
3
4 public final void hello(){
5如果(!this.CGLIB $ CONSTRUCTED)
6 {
7 super.hello();
8返回;
9
10}
11 if(this.CGLIB $ CALLBACK_0 == null)
12 {
13 CGLIB $ BIND_CALLBACKS(this);
14
15}
16 if(this.CGLIB $ CALLBACK_0!= null)
17 {
18 this.CGLIB $ CALLBACK_0.intercept(this,SimpleBean $$ EnhancerByCGLIB $$ 4c4a66a.CGLIB $ hello $ 0 $ Method,SimpleBean $$ EnhancerByCGLIB $$ 4c4a66a.CGLIB $ emptyArgs,SimpleBean $$ EnhancerByCGLIB $ 4。 $ Proxy);
19返回
20
21}
22个super.hello();
23返回;
24 catch(RuntimeException aRuntimeException2)
25 {
26 catch(Throwable aRuntimeException2)
27 {
28 UndeclaredThrowableException JdecGenerated57 = new UndeclaredThrowableException(
29}
30}
31
32 final void CGLIB $ hello $ 0()
33 {
34 super.hello();
35回报;
36}
37
注:从上面的实现代理来看,Cglib对于标识final关键字的类无法进行代理操作。
对于标识final的方法,也无法进行代理
祝好运!
您的马修!
(广州计算机培训转)
- 上一篇:初学Java正则表达式的方法
- 下一篇:细述Java中的值传递和引用传递
- Java技术排行
- 标签列表
-
- Java (3694)
- 北大青鸟 (3713)
- 软件开发 (3613)
- JAVA (3413)
- UI设计入门 (2093)
- 惠州北大青鸟 (4375)
- 惠州IT培训 (2558)
- UI设计培训 (2090)
- 惠州UI设计培训 (2095)
- 惠州UI设计培训学校 (2090)
- 惠州计算机软件培训 (6260)
- 惠州计算件软件开发 (6260)
- 惠州计算机软件基础 (6261)
- 惠州计算机JAVA培训 (3574)
- 惠州计算机Java软件开发 (3620)
- 惠州计算机JAVA软件开发 (4645)
- 惠州计算机JAVA软件开发学校 (3338)
- 惠州计算机Java软件开发培训 (3338)
- 北大青鸟IT计算机学校 (5048)
- 北大青鸟IT软件学校 (5062)
- 北大青鸟IT学校 (5059)
- 惠州计算机UI设计软件开发 (2088)
- UI设计基础教程 (2088)
- UI设计是什么 (2088)
- UI设计教程 (2088)
- 网站分类
-
- 计算机教程
- 计算机入门
- 职业学校
- 新闻动态
- 专业课程
- 热门技术
- SEO
- 培训教程
- windows
- linux教程
- 系统集成
- 网站开发
- Html5
- 办公软件
- 师资力量
- 热点问答
- 联系我们
- 计算机学校
- 惠州计算机学校
- 河源计算机学校
- 广州计算机学校
- 深圳计算机学校
- 湛江计算机学校
- 佛山计算机学校
- IT计算机培训信息
- 设计专业
- UI
- 影视特效
- 游戏动漫设计
- Photoshop
- AI设计
- 软件教程
- Java技术
- C语言/C++语言培训
- C#
- Python技术
- PHP
- 数据库
- SQL Server
- 网络教程
- 网络安全
- 网络营销
- 软件专业
- 大数据专业
- 前端开发专业
- 软件测试专业
- Python专业
- 软件实施
- 珠海计算机学校
- 初中生学什么好
- 计算机认证
- 文章归档
-
- 2024年11月 (14)
- 2024年10月 (32)
- 2024年9月 (29)
- 2024年8月 (68)
- 2024年7月 (59)
- 2024年6月 (43)
- 2024年5月 (48)
- 2024年4月 (80)
- 2024年3月 (65)
- 2024年2月 (54)
- 2024年1月 (25)
- 2023年12月 (12)
- 2023年11月 (73)
- 2023年10月 (134)
- 2023年9月 (34)
- 2023年8月 (3)
- 2023年7月 (3)
- 2023年6月 (12)
- 2023年5月 (30)
- 2023年4月 (72)
- 2023年3月 (11)
- 2023年2月 (34)
- 2023年1月 (37)
- 2022年12月 (78)
- 2022年11月 (359)
- 2022年6月 (1193)
- 2022年5月 (570)
- 2022年4月 (1567)
- 2022年3月 (982)
- 2022年2月 (54)
- 2022年1月 (182)
- 2021年9月 (308)
- 2021年8月 (1704)
- 2021年7月 (2423)
- 2021年6月 (1806)
- 2021年5月 (1569)
- 2021年4月 (1380)
- 2021年3月 (1255)
- 2021年2月 (709)
- 2021年1月 (1521)
- 2020年12月 (3626)
- 2020年11月 (1646)
- 2020年10月 (1046)
- 2020年9月 (592)
- 最近发表
-
- 清远信息:2024年广清杯清远南粤家政技能大赛举行决赛|||计算机培训机构
- 汕尾信息:陈良川带队到汕尾技师学院调研|||计算机职业技能培训班
- 东莞信息:凤岗凤岗镇组织召开社保参保缴费及劳动用工政策宣讲会|||计算机软件培训学校
- 阳江信息:2024年度注册城乡规划师职业资格考试的合格标准是怎样的?|||计算机软件培训学校
- 阳江信息:职业技能提升补贴对象有哪些?|||大学生计算机培训学校
- 清远信息:清远市首家社保服务合作网点在清城区举办启动仪式|||计算机职业技能培训班
- 汕头信息:招聘658名中高端人才!2024年汕头市引进中高端人才专场招聘会举行|||北大青鸟计算机培训中心
- 东莞信息:广东省社保智能经办现场会在东莞召开|||大学生计算机培训学校
- 东莞信息:东坑镇举办2024年重点群体系列招聘活动|||计算机职业技能培训班
- 东莞信息:万江万江街道成功举办第四届粤菜师傅烹饪技能竞赛|||广州计算机编程培训