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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
fastjson是一款Java语言编写的高性能JSON处理库,其主要特点是速度快、内存占用低、功能强大、易于使用。下面就简单介绍一下fastjson源码分析。 1. 核心架构 fastjson的核心架构包括JSONReader、JSONWriter、JSONLexer、JSONParser、JSONScanner、JSONSerializer、JSONDeserializer等模块。其JSONLexer和JSONScanner是fastjson的词法分析器,JSONParser是解析器,JSONSerializer和JSONDeserializer是序列化和反序列化实现。 2. 序列化和反序列化 fastjson的序列化和反序列化实现主要基于Java的反射机制和ASM字节码生成技术。在序列化时,fastjson会根据Java对象的类型信息来生成相应的序列化代码,并将序列化后的数据输出到JSONWriter。在反序列化时,fastjson根据JSON数据的类型信息来生成相应的反序列化代码,并将反序列化后的Java对象输出到JSONDeserializer。 3. 性能优化 fastjson在性能上有很多优化,其最重要的是使用了预编译技术,将JSON字符串解析为Java对象时,fastjson会对JSON字符串进行预编译,生成一个解析器,以提高解析效率。此外,fastjson还使用了缓存技术,将解析器和序列化器缓存起来,以便重复使用,从而减少了对象的创建和销毁所带来的开销。 4. 使用场景 fastjson广泛应用于互联网领域,如阿里巴巴、淘宝、天猫等都在使用fastjson来处理JSON数据。fastjson还支持多种数据格式的解析和序列化,如XML、CSV等。 以上是fastjson源码分析的简单介绍,相信大家对fastjson有了更深入的了解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值