首页 文章

kotlin反射得到字段列表

提问于
浏览
13

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

3 回答

  • 9

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

    MyTest::class.memberProperties
    
    // or 
    
    MyTest::class.declaredMemberProperties
    

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

    someClassOfMine.javaClass.kotlin.memberProperties
    

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

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

  • 1

    你不能在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
    

    有用 )

  • 0

    现在使用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
    

相关问题