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来协助构造.
package test;
public class Person2 {
private final String name;
private final int age;
private final int money;
private final String gender;
private Person2(Builder builder){
this.name=builder.name;
this.age=builder.age;
this.money=builder.money;
this.gender=builder.gender;
}
public static class Builder{
private final String name;
private int age;
private int money;
private String gender;
public Builder(String name){
this.name=name;
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder money(int money) {
this.money = money;
return this;
}
public Builder gender(String gender) {
this.gender = gender;
return this;
}
public Person2 build(){
return new Person2(this);
}
}
}
如此一来,我们就可以通过以下方式来构建对象:
package test;
public class Test2 {
public static void main(String[] args) {
Person2 p2=new Person2.Builder("lee")
.age(11)
.gender("man")
.money(0)
.build();
}
}
是不是很直观地体现了建造者模式的思想呢?
所以该注解就是使用建造者模式来构建JSON类的,主要也是用在javaBeaninfo这个类当中.这里的属性主要就是定义了构建方法的名字以及构建属性的前缀.
总结
由于这两个注解实际上使用的频率很小,网上有关其的介绍远少于JSONType和JSONField,但是通过比较其他的JSON工具比如jackson,我发现这类工具都有相似的注解,于是通过比对,我对fastJSON的该类注解源码才有了更加多的使用参考.我发现通过类比此类工具能够帮助我对项目的分析,后面会更加注意这一点.