Kotlin对对象实例的思考

时间:2018-06-28 19:40:28

标签: reflection kotlin

在我的项目期间,我一直在尝试kotlin.reflection上的一些东西,并且卡在我难以理解的事情上,我声明对象如下:

object WebsiteMapping
{
    const val ADMIN = "/admin"
}

一旦我致电:

Arrays
  .stream(WebsiteMapping::class.java.declaredFields)
  .forEach { field -> println(field.type) }

我得到的是:

class java.lang.String
class mapping.WebsiteMapping

当我仔细研究了clarifiedFields调用背后的原因时,我理解了它为何如此工作,但是有什么简便的方法可以只在该对象内获取已声明的const,而无需获取整个结构的根?

1 个答案:

答案 0 :(得分:4)

类型为class mapping.WebsiteMapping的字段基本上不是结构的根,而是在对象类型中生成的特殊字段,用于保存对单例对象的引用。

在Kotlin中,此字段按照惯例命名为INSTANCE。因此,您可以按照以下步骤过滤从类中获得的字段:

WebsiteMapping::class.java.declaredFields
    .filter { it.name != "INSTANCE" }
    .forEach { println(it.type) }

另一种解决方案是从java.reflect.*切换到Kotlin反射API kotlin.reflect(需要依赖kotlin-reflect module),该API会自动过滤属性:

WebsiteMapping::class.memberProperties
    .forEach { println(it.returnType) }