IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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来协助构造.

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的该类注解源码才有了更加多的使用参考.我发现通过类比此类工具能够帮助我对项目的分析,后面会更加注意这一点.

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-15 18:08:21  更:2021-12-15 18:10:22 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码