fastJSON源码分析_9_fastJSON中的注解(上)

2021SC@SDUSC

目录

 本篇简介

使用示例

 源码分析

JSONType类

 JSONField类

总结


 本篇简介

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。

Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。

fastJSON提供了4种注解,分别是@JSONType,@JSONCreator,@JSONField,@JSONPOJOBuilder

这些注解可以让使用者通过一种做标记的方式对内容进行一些配置.本篇以及下一篇将对这些注解进行一个简单的分析.

使用示例

@JSONType

使用时放在javaBean上,可以规定哪些字段需要忽略或者需要包含,以及配置特性,这比起通过使用JSON的方法以参数的形式来传入序列化特性要简便直观许多.

在Person类中如下配置

 输出内容忽略了"age"字段并且输出了类名

 @JSONField

使用时放在javaBean的具体field或者方法上面,可以修改某个属性的输出名称,规定其支持序列化或者反序列化与否以及规定序列化顺序.

我们作如下配置

先将javabean序列化为字符串,再反序列化回去再序列化出来得到以下输出,可以看到字段名改变了并且按照了指定的顺序,以及名字无法被反序列化的结果

 源码分析

JSONType类

先看该类的注解定义

 我们知道@Retention是指该注解的生命周期

package java.lang.annotation;
public enum RetentionPolicy {
    SOURCE,            /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了  */

    CLASS,             /* 编译器将Annotation存储于类对应的.class文件中。默认行为  */

    RUNTIME            /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
}

因为fastJSON的使用需要获取JSONType中的信息,因此一定是使用RUNTIME的类型,这样可以保证在运行时也能获取到注解内容.

@Target是指定的该注解的使用位置,ElementType.TYPE指的便是可以使用在类名上,所有的类别有

package java.lang.annotation;

public enum ElementType {
    TYPE,               /* 类、接口(包括注释类型)或枚举声明  */

    FIELD,              /* 字段声明(包括枚举常量)  */

    METHOD,             /* 方法声明  */

    PARAMETER,          /* 参数声明  */

    CONSTRUCTOR,        /* 构造方法声明  */

    LOCAL_VARIABLE,     /* 局部变量声明  */

    ANNOTATION_TYPE,    /* 注释类型声明  */

    PACKAGE             /* 包声明  */
}

(以上代码来自菜鸟教程)

了解了@JSONType的构造后,我们看它的字段,

 配置项很多,在示例中我们只展示了其中的2种.

除了常用的includes,ignores,serializeFeatures,parseFeatures外,还有顺序orders,字段的格式naming,类型名称typename等等.

在源码中,以上一篇文章为例,

我们知道@JSONType的使用就是通过某对象的getAnnotation方法(TypeUtils封装了该方法)获取JSONType对象,然后直接调用该对象的相应属性来获取配置,非常方便.

 JSONField类

同样的,我们查看JSONField类的源码,

 发现不仅它能够使用到方法,字段上面,还能使用到参数上.

 在fastJSON中,通过getAnnotation获取或者通过getPararmAnnotation来获取

总结

fastJOSN注解能够非常方便快捷地帮助使用者进行清晰简明地配置对应javabean的序列化反序列化方案,学习注解的使用,让我也希望尝试在之后的开发中尝试使用注解这一机制.下一篇将继续分析剩下的两个注解.

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、付费专栏及课程。

余额充值