一、实现原理
- 利用ASM开源包,将真实对象类的class文件加载进来,通过修改字节码生成其子类,覆盖父类相应的方法。
备注:ASM是直接操作字节码的框架。
二、实现方式
- 1)定义拦截处理器。实现MethodInterceptor接口,覆写intercept方法用于拦截处理。
- 2)生成动态代理类。修改被代理对象的class文件字节码生成子类。
1 | 复制代码 <dependency> |
1 | 复制代码package com.java24k.example.target; |
1 | 复制代码package com.java24k.example.interceptor; |
1 | 复制代码package com.java24k.example.test; |
1 | 复制代码------插入前置通知代码------------- |
三、FastClass机制
在JDK动态代理中,调用目标对象的方法使用的是反射,而在CGLIB动态代理中使用的是FastClass机制。
- FastClass使用:动态生成一个继承FastClass的类,并向类中写入委托对象,直接调用委托对象的方法。
- FastClass逻辑:在继承FastClass的动态类中,根据方法签名(方法名字+方法参数)得到方法索引,根据方法索引调用目标对象方法。
- FastClass优点:FastClass用于代替Java反射,避免了反射造成调用慢的问题。
第二节和第三节我们将剖析CGLIB生成动态代理源码和FastClass源码。
本文转载自: 掘金