Kotlin反思 - 检查财产是否有类型

时间:2017-03-23 09:38:01

标签: reflection kotlin

我想迭代我的一个类中的所有字段,过滤注释的字段,然后检查字段是否有一个特定的类型。
我发现的只有field.returnType.isSubtype(other: KType),但我不知道如何获得我其他课程的KType

到目前为止,这是我的代码:

target.declaredMemberProperties.forEach {
    if (it.findAnnotation<FromOwner>() != null) {
        if ( /*  it.returnType is Component <- Here I need some working check   */ ) {

            // do stuff
         } else {

            // do ther stuff
         }
    }
}

1 个答案:

答案 0 :(得分:8)

这里至少有两种解决方案:

  • 使用.jvmErasure获取KClass<*> it.returnType,然后检查KClass es的子类型关系:

    it.returnType.jvmErasure.isSubclassOf(Component::class)
    
  • 从Kotlin 1.1开始,您可以使用.createType()KType令牌构造KClass(检查其可选参数:您可以使用它们来提供可为空性信息,输入参数和注释),然后按照建议检查子类型:

    it.returnType.isSubtypeOf(Component::class.createType())
    

    在每次迭代时创建类型可能会引入性能问题,请确保在需要时对其进行缓存。