首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象实例上的Kotlin反射

对象实例上的Kotlin反射
EN

Stack Overflow用户
提问于 2018-06-29 03:40:28
回答 1查看 560关注 0票数 2

在我的项目期间,我一直在尝试来自kotlin.reflection的一些东西,并且被一些对我来说很难理解的东西卡住了,我已经声明了如下对象:

代码语言:javascript
复制
object WebsiteMapping
{
    const val ADMIN = "/admin"
}

一旦我调用:

代码语言:javascript
复制
Arrays
  .stream(WebsiteMapping::class.java.declaredFields)
  .forEach { field -> println(field.type) }

我得到的是:

代码语言:javascript
复制
class java.lang.String
class mapping.WebsiteMapping

当我稍微了解一下declaredFields调用背后的原因时,我理解了它的工作原理,但是有没有什么方便的方法可以只接受对象中声明的const,而不获取整个结构的根?

EN

回答 1

Stack Overflow用户

发布于 2018-06-29 03:48:46

基本上,类型为class mapping.WebsiteMapping的字段不是结构的根,而是在object类型中生成的一个特殊字段,其中包含对单例对象的引用。

在Kotlin中,这个字段按照惯例被命名为INSTANCE。因此,您可以按如下方式筛选从类中获得的字段:

代码语言:javascript
复制
WebsiteMapping::class.java.declaredFields
    .filter { it.name != "INSTANCE" }
    .forEach { println(it.type) }

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

代码语言:javascript
复制
WebsiteMapping::class.memberProperties
    .forEach { println(it.returnType) }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51090216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档