在项目期间,我一直在尝试使用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) }

10-08 03:07