| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> fastJSON源码分析_10_fastJSON中的注解(下) -> 正文阅读 |
|
[Java知识库]fastJSON源码分析_10_fastJSON中的注解(下) |
2021SC@SDUSC ?本篇介绍本篇承接上一篇文章继续介绍剩下的两种注解的使用方法以及其源码分析.本篇所介绍的两种注解,也就是JSONCreator以及JSONPOJOBuilder在平常一般是不怎么使用的,但是既然存在那么一定有其使用的场景. 源码分析@JSONCreator我们直接到其源码部分 这个注解主要用于标注于构造器方法与普通方法上,然而我们发现,在实际上,该注解只是一个"空"的注解,没有提供任何属性来访问,是否说明该注解是被弃用了呢?当然不是,因为该注解本身的存在也是一种属性,我们按住ctrl并点击该注解名,查看其使用的场景, ? ?发现在非测试代码里面,该注解主要用于反序列化配置(ParseConfig)和实体类信息(javaBeanInfo)中,由于我的主要负责部分是序列化内容,而正好在之前我们分析了JavaBeanInfo的功能,所以我们直接来看JavaBeanInfo类中的@JSONCreator的处理源码. 在图片中看出,javaBeanInfo中使用了三处JSONCreator,第一处是在import,不考虑,接下来还有两处使用过: 第一处 ?通过方法名可以很清楚地知道这个方法是在获取Creator的构造方法,在一个类中有许多构造方法,但是如何确定javaBean序列化器使用的构造方法则是通过该方法来实现的. 在fastJSON源码中,javaBeanInfo的build方法里主要就写下了如何通过javaBean类参数来创建一个javaBeanInfo对象,而该方法先通过clazz.getDeclaredConstructor方法获取所有声明的构造方法,接着再将获取的所有构造方法作为参数交给图中方法,去获取序列化器的专用构造方法. 图中源码表示,先去所有的构造器方法中寻找是否含有@JSONCreator注解,有的话就将其设置为序列化器的构造方法,这里官方注释的意思是,这里循环地去查询是否有JSONCreator注解,如果出现了多个的话,就会报"multi-JSONCreator"错误,所以不会获取到注解后就直接break. 在第二处的获取JSONCreator注解处: ?这里是获取工厂方法的方法,也就是说,刚才我们知道@JSONCreator注解可以用于构造方法,还能用于普通方法,其实这个"普通方法"指的就是静态工厂方法,目的也就是确定使用哪一种工厂方法来构造javaBeanInfo对象.这里的相关代码和第一处的代码一致,这里就不再赘述. @JSONPOJOBuilder在源码分析前,我们先介绍一下POJO是什么,事实上POJO的全称就叫作Plain Ordinary Java Object 即普通的java对象,使用这样一个名字的原因主要是强调其普通性,也就是说POJO既非javaBean这样的框架组件,也不继承任何接口,只是一个java对象而以. 然后就是有关设计模式中的builder模式,简单来说,简单的builder模式的思想就是创建一个对象后,手动地去设置其属性,一步一步构建出该属性,简单的例子就是: ?虽然看上去很简单,但是如果使用其变种的话就有很直观的效果了:我们定义以下的类Person2, 这个类构造方法私有,但是我们使用一个内部的静态类Builder来协助构造.
如此一来,我们就可以通过以下方式来构建对象:
是不是很直观地体现了建造者模式的思想呢? 所以该注解就是使用建造者模式来构建JSON类的,主要也是用在javaBeaninfo这个类当中.这里的属性主要就是定义了构建方法的名字以及构建属性的前缀. ?总结由于这两个注解实际上使用的频率很小,网上有关其的介绍远少于JSONType和JSONField,但是通过比较其他的JSON工具比如jackson,我发现这类工具都有相似的注解,于是通过比对,我对fastJSON的该类注解源码才有了更加多的使用参考.我发现通过类比此类工具能够帮助我对项目的分析,后面会更加注意这一点. |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 6:07:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |