在我的项目期间,我一直在尝试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,而无需获取整个结构的根?
答案 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) }