kotlin反射得到字段列表

fwi*_*lhe 16 reflection jvm kotlin

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

Jay*_*ard 11

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

MyTest::class.memberProperties

// or 

MyTest::class.declaredMemberProperties
Run Code Online (Sandbox Code Playgroud)

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

someClassOfMine.javaClass.kotlin.memberProperties
Run Code Online (Sandbox Code Playgroud)

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

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


ark*_*oak 5

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

val fields = MyClass.javaClass.kotlin.members
Run Code Online (Sandbox Code Playgroud)

其中 MyClass 是您选择的类。

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

compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
Run Code Online (Sandbox Code Playgroud)

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

val fields = MyClass.javaClass.declaredFields
Run Code Online (Sandbox Code Playgroud)


Leo*_*dos 3

在 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(", ")
    }    
}
Run Code Online (Sandbox Code Playgroud)

我们来测试一下:

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)
Run Code Online (Sandbox Code Playgroud)

结果:

Fields: anotherVar, emptyClass, emptyTrait, contant, $kotlinClass
anotherVar: null
anotherVar: 10
Run Code Online (Sandbox Code Playgroud)

有用 )