携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的27天,点击查看活动详情
为了活动小家电,接着上篇搞!
在前面几篇文章中,我对 Annotation 和 Annotation using Reflection 做了一个概述。
使用Reflection创建Custom Annotation时,每次新增注解都需要编写复杂的反射相关代码,验证逻辑难以理解,性能也很差。
创建一个模块
文件 → 新建 → 新模块 → Java 或 Kotlin
库以创建 test-annotation 和 test-processor 模块。
test-annotation
test-annotation 模块是定义注释类的模块。
首先,build.gradle 文件如下。
apply plugin: 'kotlin'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
sourceCompatibility = "7"
targetCompatibility = "7"
下面是一个为验证目的定义注解的文件。
package com.example.test_annotation.annotation
/**
* Model类注解
* 任何需要验证的类都应该用这个注释
*/
@Target(AnnotationTarget.CLASS)
annotation class DataValidation
/**
* 嵌套字段
* 嵌套模型字段应使用此注释。 如果不是就忽略
*/
@Target(AnnotationTarget.FIELD)
annotation class Nested
/**
* 非空约束
*/
@Target(AnnotationTarget.FIELD)
annotation class NotNull(
val tag: String
)
/**
* 字符串字段最小长度约束
*/
@Target(AnnotationTarget.FIELD)
annotation class MinLength(
val length: Int,
val tag: String
)
/**
* 字符串字段最大长度约束
*/
@Target(AnnotationTarget.FIELD)
annotation class MaxLength(
val length: Int,
val tag: String
)
/**
* 字符串字段正则表达式匹配约束
*/
@Target(AnnotationTarget.FIELD)
annotation class Regex(
val regex: String,
val tag: String
)
/**
* 数字最小值
*/
@Target(AnnotationTarget.FIELD)
annotation class MinValue(
val value: Long,
val tag: String
)
/**
* 数字最大值
*/
@Target(AnnotationTarget.FIELD)
annotation class MaxValue(
val value: Long,
val tag: String
)
DataValidation是一个注解,其目标是 CLASS,用于附加到Model类以进行验证工作。
Nested有另一个模型作为模型的字段,需要验证的时候也会用到模型。
其余的注解根据注释就可以了。
下面是对模型执行验证时要返回的模型。
data class FieldNameTag(
val fieldName: String,
val tag: String
)
data class ValidationResult(
var isValid: Boolean = true,
val invalidFieldNameTags: MutableList<FieldNameTag> = mutableListOf()
)
isValid 字段用于检查所有字段是否有效,fieldName 和 tag 是在需要时创建的字段,并且是无效字段名称和用户在注释中作为参数放置的附加说明的字段。