kotlin反射得到字段列表

在Kotlin有一个等效的java反射 foo.getClass().getFields() 吗?当我知道它的名字时,我只能发现我可以访问一个字段,但我想以通用的方式处理字段 .

回答(3)

3 years ago

你想要“支持字段”中的字段或“属性”中的字段...... Kotlin真的只有属性 . 你可以使用以下方法获得这些课程:

MyTest::class.memberProperties

// or 

MyTest::class.declaredMemberProperties

从Java Class<T> 中,使用 kotlin 扩展属性来获取Kotlin KClass<T> ,您可以从中继续:

someClassOfMine.javaClass.kotlin.memberProperties

这需要将 kotlin-reflect 依赖项添加到构建和类路径中 . 你会在 KClass 找到许多其他有用的东西

对于属性后面的秘密支持字段,使用Java反射需要您自担风险 .

3 years ago

你不能在Kotlin中做到这一点,但是在java中有一种肮脏的不可靠的方法 . 你可以使用java反射 . 像这样:

public class TestClass {

    trait EmptyTrait
    class EmptyClass

    public var anotherVar:Int? = null
    public val contant:Float = 10f
    private var emptyTrait:EmptyTrait? = null
    val emptyClass:EmptyClass = EmptyClass()

    public fun setVal(fieldName: String, value: Int) {
        javaClass.getDeclaredField(fieldName).set(this, value);
    }

    public fun getFieldNames(): String {
        return javaClass.getDeclaredFields().map{it.getName()}.join(", ")
    }    
}

我们来测试一下:

val t = TestClass()
Log.v("MainActivity", "Fields: " + t.getFieldNames())
Log.v("MainActivity", "anotherVar: " + t.anotherVar)
t.setVal("anotherVar", 10)
Log.v("MainActivity", "anotherVar: " + t.anotherVar)

结果:

Fields: anotherVar, emptyClass, emptyTrait, contant, $kotlinClass
anotherVar: null
anotherVar: 10

有用 )

3 years ago

现在使用Kotlin v1.1非常简单,您可以使用以下方法获取kotlin中的字段

val fields = MyClass.javaClass.kotlin.members

MyClass是您选择的课程 .

为了使用它,你需要在你的gradle构建文件中包含kotlin-reflect,如下所示

compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"

另外,如果你需要java字段,也可以直接从javaClass中获取字段(在某些情况下很有用,因为这些字段覆盖的范围略有不同)

val fields = MyClass.javaClass.declaredFields