在项目期间,我一直在尝试使用kotlin.reflection
中的某些内容,并且陷入了我难以理解的事情中,我声明了object如下:
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而不获取整个结构的根?
最佳答案
基本上,类型为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依赖),这会自动过滤属性:WebsiteMapping::class.memberProperties
.forEach { println(it.returnType) }