为了活动小家电-注解Annotation(四)

108 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的26天,点击查看活动详情

为了活动小家电,接着上篇搞!

现在,我将尝试创建一个简单地执行数据模型的字符串字段验证的函数。

@Target(AnnotationTarget.PROPERTY)
annotation class StringConstraint(
    val minLength: Int,
    val maxLength: Int
)

首先,您可以使用名为 StringConstraint 的注解设置 String Field 的最小长度和最大长度。

data class Data(
    @StringConstraint(1, 5)
    val title: String,
    @StringConstraint(10, 50)
    val contents: String
)

您希望将 Data 类的标题字段限制为 1 到 5 个字符,并将内容字段限制为 10 到 50 个字符。

object FieldValidator {
    data class ValidationResult(
        var isValid: Boolean = true,
        val invalidFieldNames: MutableList<String> = mutableListOf()
    )

    fun validate(data: Any): ValidationResult {
        val result = ValidationResult()

        data::class.declaredMemberProperties.forEach {
            val field = it
            val annotation = it.findAnnotation<StringConstraint>()

            if (annotation != null && field.getter.visibility == KVisibility.PUBLIC) {
                val fieldValue = field.getter.call(data) as String
                if (fieldValue.length !in annotation.minLength..annotation.maxLength) {
                    result.isValid = false
                    result.invalidFieldNames.add(field.name)
                }
            }
        }

        return result
    }
}

验证器。validate() 函数检查作为参数接收的实例的所有字段,检查是否附加了@StringAnnotation,如果存在不在 (minLength .. maxLength) 范围内的字段,则返回字段名称。

fun test() {
        val data = Data(
            "短字符串",
            "短字符串短字符串短字符串短字符串短字符串短字符串短字符串短字符串短字符串短字符串短字符串短
字符串短字符串短字符串短字符串短字符串短字符串短字符串短字符串短字符串短字符串 ---- 反正超过了50个"
        )

        val validationResult = FieldValidator.validate(data)
        LogUtils.e("有效性: ${validationResult.isValid}  无效的字段: ${validationResult.invalidFieldNames}")
    }

让我们运行实际验证。

有效性: false  无效的字段: [contents]

验证失败,因为contents字段最多 50 个字符。


到目前为止,我已经制作了使用反射执行字段验证的 Annotation。在下一篇文章中,我们将看到如何在编译时使用代码生成将逻辑插入到注释中。

为了活动小家电,下篇继续搞!