2017-03-23 37 views
1

我想遍历其中一个类的所有字段,筛选注释的字段,然后检查该字段是否有一个特定的类型。
我找到的只是field.returnType.isSubtype(other: KType),但我不知道如何获得我其他班级的KTypeKotlin Reflection - 检查属性是否有类型

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

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 
     } 
    } 
} 

回答

5

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

  • 使用.jvmErasure获取的it.returnTypeKClass<*>,然后检查了KClass ES亚型关系:

    it.returnType.jvmErasure.isSubclassOf(Component::class) 
    
  • 由于科特林1.1,你可以使用.createType()KClass令牌构建KType(检查它的可选参数:你可以用它们来提供空性信息,类型参数和注释),然后检查亚型如你所说:

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

    在每次迭代中创建类型可能会引入性能问题,请确保在经常需要时缓存它。

+0

这是否意味着在伴随对象中有'val componentType by lazy {Component :: class.createType()}'是一个好主意? – danielspaniol

+0

@Exhauzt,我想基准你的特定用例应该在这里给出最好的答案。 – hotkey