马士兵MCA架构师读书笔记
B站可看
https://space.bilibili.com/700869881
public void generateClass(ClassVisitor v) throws Exception {
//声明需代理的类 或者接口
Class sc = (superclass == null) ? Object.class : superclass;
//检查 final类无法被继承
if (TypeUtils.isFinal(sc.getModifiers()))
throw new IllegalArgumentException("Cannot subclass final class " + sc.getName());
//找到该类所有声明了的构造函数
List constructors = new ArrayList(Arrays.asList(sc.getDeclaredConstructors()));
//去掉private之类的不能被继承的构造函数
filterConstructors(sc, constructors);
// Order is very important: must add superclass, then
// its superclass chain, then each interface and
// its superinterfaces.
//这儿顺序非常重要 上面是源码的注释 直接留着 相信大家都能看懂
//声明代理类方法集合
List actualMethods = new ArrayList();
//声明代理接口接口方法集合
List interfaceMethods = new ArrayList();
//声明所有必须为public的方法集合 这儿主要是代理接口接口的方法
final Set forcePublic = new HashSet();
//即通过传入的代理类 代理接口,遍历所有的方法并放入对应的集合
getMethods(sc, interfaces, actualMethods, interfaceMethods, forcePublic);
//对所有代理类方法修饰符做处理
List methods = CollectionUtils.transform(actualMethods, new Transformer() {
public Object transform(Object value) {
Method method = (Method)value;
int modifiers = Constants.ACC_FINAL
| (method.getModifiers()
& ~Constants.ACC_ABSTRACT
& ~Constants.ACC_NATIVE
& ~Constants.ACC_SYNCHRONIZED);
if (forcePublic.contains(MethodWrapper.create(method))) {
modifiers = (modifiers & ~Constants.ACC_PROTECTED) | Constants.ACC_PUBLIC;
}
return ReflectUtils.getMethodInfo(method, modifiers);
}
});
//创建类写入器
ClassEmitter e = new ClassEmitter(v);
//1.开始创建类 并写入基本信息 如java版本,类修饰符 类名等
if (currentData == null) {
e.begin_class(Constants.V1_8,
Constants.ACC_PUBLIC,
getClassName(),
Type.getType(sc),
(useFactory ?
TypeUtils.add(TypeUtils.getTypes(interfaces), FACTORY) :
TypeUtils.getTypes(interfaces)),
Constants.SOURCE_FILE);
} else {
e.begin_class(Constants.V1_8,
Constants.ACC_PUBLIC,
getClassName(),
null,
new Type[]{FACTORY},
Constants.SOURCE_FILE);
}
List constructorInfo = CollectionUtils.transform(constructors, MethodInfoTransformer.getInstance());
//2. 声明一个private boolean 类型的属性:CGLIB$BOUND
e.declare_field(Constants.ACC_PRIVATE, BOUND_FIELD, Type.BOOLEAN_TYPE, null);
//3. 声明一个public static Object 类型的属性:CGLIB$FACTORY_DATA
e.declare_field(Constants.ACC_PUBLIC | Constants.ACC_STATIC, FACTORY_DATA_FIELD, OBJECT_TYPE, null);
// 这个默认为true 如果为false则会声明一个private boolean 类型的属性:CGLIB$CONSTRUCTED
if (!interceptDuringConstruction) {
e.declare_field(Constants.ACC_PRIVATE, CONSTRUCTED_FIELD, Type.BOOLEAN_TYPE, null);
}
//4. 声明一个public static final 的ThreadLocal:ThreadLocal
e.declare_field(Constants.PRIVATE_FINAL_STATIC, THREAD_CALLBACKS_FIELD, THREAD_LOCAL, null);
//5. 声明一个public static final 的CallBack类型的数组:CGLIB$STATIC_CALLBACKS
e.declare_field(Constants.PRIVATE_FINAL_STATIC, STATIC_CALLBACKS_FIELD, CALLBACK_ARRAY, null);
//如果serialVersionUID不为null 则设置一个public static final 的Long类型 serialVersionUID
if (serialVersionUID != null) {
e.declare_field(Constants.PRIVATE_FINAL_STATIC, Constants.SUID_FIELD_NAME, Type.LONG_TYPE, serialVersionUID);
}
//遍历CallBackTypes 即我们构建Enhancer是setCallBack的所有类的类型 本案例中是methodInterceptor 并且只传入了一个
for (int i = 0; i < callbackTypes.length; i++) {
//6.声明一个private 的传入的CallBack类型的属性:CGLIB$CALLBACK_0 (从0开始编号,)
e.declare_field(Constants.ACC_PRIVATE, getCallbackField(i), callbackTypes[i], null);
}
//7声明一个private static 的传入的Object类型的属性:CGLIB$CALLBACK_FILTER
e.declare_field(Constants.ACC_PRIVATE | Constants.ACC_STATIC, CALLBACK_FILTER_FIELD, OBJECT_TYPE, null);
//判断currentData
if (currentData == null) {
//8.为null则开始声明所有的代理类方法的变量 以及其具体的重写实现方法,还有static初始化执行代码块
emitMethods(e, methods, actualMethods);
//9.声明构造函数
emitConstructors(e, constructorInfo);
} else {
//声明默认构造函数
emitDefaultConstructor(e);
}
//
emitSetThreadCallbacks(e);
emitSetStaticCallbacks(e);
emitBindCallbacks(e);
//如果currentData不为null
if (useFactory || currentData != null) {
//获取到所有CallBack索引数组
int[] keys = getCallbackKeys();
//10.声明三个newInstance方法
//只有一个callback参数
emitNewInstanceCallbacks(e);
//参数为callback数组
emitNewInstanceCallback(e);
//参数为callback数组 以及附带的一些参数
emitNewInstanceMultiarg(e, constructorInfo);
//11.声明getCallBack方法
emitGetCallback(e, keys);
//12.声明setCallBack方法
emitSetCallback(e, keys);
//12.声明setCallBacks方法
emitGetCallbacks(e);
//12.声明setCallBacks方法
emitSetCallbacks(e);
}
//类声明结束
e.end_class();
马士兵MCA架构师读书笔记相关推荐
- 马士兵mca课程java学习笔记
马士兵mca课程java学习笔记 大四毕业刚买了马士兵的mca架构课程,包括java从小白到大神的基础工程师课程,左程云左老师的算法与数据结构,mca架构课和大数据架构课.马老师的课程内容实在是太多了 ...
- 马士兵java框架_马士兵java架构师
马士兵java架构师 开始讨论缓存之前,让我们先来讨论讨论另外一个问题:理论和实践.从ahuaxuan接触的程序员来看,有的程序员偏实践,有的程序员偏理论,但是这都是不好的行为,理论和实践同样重要,我 ...
- 《大型网站技术架构》读书笔记之七:随需应变之网站的可扩展架构
来源:http://www.cnblogs.com/edisonchou/p/3862389.html 此篇已收录至<大型网站技术架构>读书笔记系列目录贴,点击访问该目录可获取更多内容. ...
- 《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构
来源:http://www.cnblogs.com/edisonchou/p/3809839.html 此篇已收录至<大型网站技术架构>读书笔记系列目录贴,点击访问该目录可获取更多内容. ...
- 《大型网站技术架构》读书笔记三:大型网站核心架构要素
来源:http://www.cnblogs.com/edisonchou/p/3806348.html 此篇已收录至<大型网站技术架构>读书笔记系列目录贴,点击访问该目录可获取更多内容. ...
- 《大型网站技术架构》读书笔记一:大型网站架构演化
来源:http://www.cnblogs.com/edisonchou/p/3773891.html 此篇已收录至<大型网站技术架构>读书笔记系列目录贴,点击访问该目录可获取更多内容. ...
- 系统架构师学习笔记_第六章(下)_连载
系统架构师学习笔记_第六章(下)_连载 6.3 基于 UML 的软件开发过程 6.3.1 开发过程概述 UML 是独立于软件开发过程的,能够在几乎任何一种软件开发过程中使用.迭代的渐进式软件开发过程 ...
- 使用elasticsearch文件搜索系统助力亚马逊解决方案架构师认证考试
当真没想到随手写的一个文章 使用elasticsearch搭建文件搜索系统(带界面),居然会有这么多的点赞.哈哈,应该是贫穷限制了我的想象力,感谢30多位同学的赞.总之趁热打铁,围绕这个话题,趁我还有 ...
- 【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器
本文属于[Azure 架构师学习笔记]系列. 本文属于[Azure Data Factory]系列. 接上文[Azure 架构师学习笔记]-Azure Data Factory (3)-触发器详解-翻 ...
最新文章
- android不公开的面试题偶!!!
- 隔空操控iPhone!苹果新获悬停手势专利
- [Js代码风格]浅析模块模式
- C语言对p1口取反,单片机c语言编程基础(5页)-原创力文档
- Java中的访问限制符
- 非域环境下使用证书部署数据库(SqlServer2008R2)镜像
- 牛客题霸 [ 	调整数组顺序使奇数位于偶数前面] C++题解/答案
- 栈空间_Linux中的进程栈和线程栈
- MTK 驱动---(9)emmc 分区管理
- Linux学习之Vim使用
- DiffImg_PDF文件比较软件diffpdf及JPG校对软件Diffimg绿化版
- 强大的RSS阅读器 Reeder 4 for Mac 4.1.1
- 信号处理学习笔记2——维纳滤波器
- Kik CEO Ted Livingston发博称要成为西方的微信?
- 机械键盘用哪种轴的好?
- 与电容有关的几个经典电路--微分、积分、采样与电荷泵
- Fedora的服务详解zz
- 因虚拟光驱引发的困惑
- quectel(短消息服务命令)9
- 必应输入法不争气,自力更生
热门文章
- Access:collating sort order SortOrder[2052(0)]
- AMBA总线协议的学习-AHB,ASB,APB三种总线以及AXI接口
- postman断言—Chai.js语法总结
- 系统设计中的集群隔离和机房隔离
- JAVA-File类与IO流
- 图片添加水印的方法,这个真的很实用!
- 利用媒体查询实现仿星巴克首页布局页面
- 快速学习-ElasticaSearch6.2.1搜索管理
- 洛谷分支结构:小鱼的航程(改进版),C语言
- updated beforeUpdate() Updated() 生命周期-销毁阶段 vue的nextTick@stage3---week2--day4-1