2021SC@SDUSC
目录
本篇简介
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的序列化反序列化方案,学习注解的使用,让我也希望尝试在之后的开发中尝试使用注解这一机制.下一篇将继续分析剩下的两个注解.