在我的项目期间,我一直在尝试来自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当我稍微了解一下declaredFields调用背后的原因时,我理解了它的工作原理,但是有没有什么方便的方法可以只接受对象中声明的const,而不获取整个结构的根?
发布于 2018-06-29 03:48:46
基本上,类型为class mapping.WebsiteMapping的字段不是结构的根,而是在object类型中生成的一个特殊字段,其中包含对单例对象的引用。
在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) }https://stackoverflow.com/questions/51090216
复制相似问题