cglib源码分析
2023-04-08 22:31:45 5 举报
个人对于cglib的源码的理解,以图为形式
作者其他创作
大纲/内容
LoadingCache的对象里面,keyMapper对应的是GET_KEY,loader对应的是load
generatedClasses
注意此处的Generator,它是KeyFactory的静态内部类并且是继承至AbstractClassGenerator,所以下面的方法其实底层都是KeyFactory的Generator
KeyFactory create()方法会创建一个简单的代理生成器gen,类型为Generator,即只有hashcode,toString,newInstance方法的生成器,并且在gen对象set进去定制器、类加载器、接口类型、ContextClass
两个关键的lambda表达式
执行了lambda语句得到cacheKey
得到一个ClassloaderData
GET_KEY
data
public Object create() { classOnly = false; argumentTypes = null; return createHelper(); }
创建过程
执行sbObject的方法,就会进入到Sc的intercept方法里面了
使用ennhanceKey
这里的this是AbstractClassGeneratorObject cachedValue = generatedClasses.get(gen);
调用KeyFactory的Generator的create()方法
请求Sb的代理类
使用Sb
Sb sbObject = (Sb) enhancer.create();
enhancer.setCallback(new Sc());
红色代表复用绿色代表最终执行方法的关键点
调用super.create()方法,即AbstractClassGenerator的create方法,此方法会被重复使用
1、对CACHE变量操作
gen是key
enhancer.setSuperclass(Sb.class);
关键代码
new ClassLoaderData(classLoader),此处对象会被重复使用
得到Sb的代理类
get方法里面有KK cacheKey = this.keyMapper.apply(key);keyMapper是GET_KEY
得到KEY_FACTORY
表层的代码执行顺序
Sb.class是目标代理类
方法里面有一个关键变量load
3、return firstInstance((Class) obj);以2的结果进行实例化,最终得到代理类
Sc.class是回调方法,回调方法就是我们对代理对象的增强的处理的地方注意:cglib使用的是实现依赖MethodInterceptor,重写intercept的方式
new Enhancer()
需要先创建EnhancerKey 类型的KEY_FACTORY对象,但是EnhancerKey是Enhancer的一个内部接口,所以要先把font color=\"#323232\
0 条评论
下一页