【发布时间】:2020-01-16 05:08:38
【问题描述】:
我正在使用 Kotlin 反射来检查具有特定注释的属性是否为空。
举个例子:
data class DataClass(
@SomeRandomAnnotation
val otherAnnotated: String?,
val inner: InnerClass
)
data class AnotherDataClass(
@SomeRandomAnnotation
val annotatedProperty: String?,
val dataClass: DataClass
) {
fun checkCreditAnalysisConstrain() {
print(checkConstrain(this))
}
}
以及检查它的函数:
fun checkConstrain(parentClass: Any): List<String> {
val filter = parentClass::class.memberProperties.filter {
if (memberIsDataClass(it)) checkConstrain(getMemberPropertyInstance(parentClass, it))
hasAnnotation(it) && propertyIsNull(it, parentClass)
}
return filter.map { formatResult(parentClass, it) }
}
这个想法是,该函数将遍历我的类的属性,检查它们是否具有注释并检查值是否为空。 如果属性是一个数据类,代码会递归地评估孩子的属性。
之后,我映射结果,将 KProperty 转换为人类可读的简单字符串,包含类名和属性名。
问题是上面的代码没有按预期工作。返回的属性只是一级类的属性。
如果我不做过滤器,而是运行 forEach 并打印结果,我会得到预期的属性。所以我很确定这与过滤器内的重复出现有关。
您是否发现了任何以更实用的方式执行此操作的方法?我只是担心我不需要“临时”列表并将值添加到列表中并在之后重置它。
【问题讨论】:
标签: algorithm kotlin reflection