kotlin反射得到字段列表

时间:2015-02-08 08:05:44

标签: reflection jvm kotlin

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

6 个答案:

答案 0 :(得分:9)

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

MyTest::class.memberProperties

// or 

MyTest::class.declaredMemberProperties

从Java Class<T>开始,使用kotlin扩展名属性来获取可以继续使用的Kotlin KClass<T>

someClassOfMine.javaClass.kotlin.memberProperties

这需要将kotlin-reflect依赖项添加到构建和类路径中。您会在KClass

上找到许多其他有用的内容

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

答案 1 :(得分:2)

简单的答案

在你的 build.gradle (app) 文件中

implementation("org.jetbrains.kotlin:kotlin-reflect:$kotlin_version")

然后

val fields = YourClass::class.declaredMemberProperties
for (i in fields){
    Log.e("Fields ===", i.name)
}

干杯!!!

答案 2 :(得分: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

它有效)

答案 3 :(得分: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

答案 4 :(得分:0)

Kotlin 中有一种方法可以工作,而不必在项目中添加新的依赖项:

假设有一个名为Mine的自定义类

class Mine(var prop:String) {
    fun myMethod():Boolean {
        return true
    }
}

名为isMethod

的新用户功能
fun isMethod(t:Any, s:String):Boolean {
try  {
    t.javaClass.getMethod(s)   // or t::class.java.getMethod(s)
    return true
  } catch(e:Exception)  {
    return false
  }    
}

在声明一个Mine实例并对其进行测试之后。

fun main() {
  var m = Mine("Paulo")  
  println(isMethod(m, "myMethod"))  // it prints true
  println(isMethod(m, "otherMethod"))  // it prints false
}

答案 5 :(得分:0)

像这样:

  User::class.memberProperties.forEach { member ->
        log.i("${member.name} -> ${member.get(this)}")
    }

效果很好