2015-02-08 41 views
12

的名单是有在科特林Java反射foo.getClass().getFields()等效?我只能发现,当我知道它是名字时我可以访问一个字段,但我想以通用的方式处理字段。科特林反射得到场

+4

AFAIK它正在开发中。随意明星或投票相关的问题(https://youtrack.jetbrains.com/issue/KT-6570)获取更新。 – bashor 2015-02-08 12:09:46

+0

谢谢,这回答我的问题。我找不到按钮“接受”你回答.. – fwilhe 2015-02-08 14:35:07

+0

不客气!评论无法标记。 – bashor 2015-02-08 20:39:50

回答

1

你不能做到这一点在科特林,但有一个肮脏的不可靠的方式在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

这不是我所需要的,我想遍历类的字段(它可能有任何数量的字段名称,我不知道),因此一个“列表”(任何种类)的问题.. – fwilhe 2015-02-09 19:36:30

+0

有getFields方法,片刻) – Leonidos 2015-02-10 08:20:21

+0

科特林反射可以做到这一点更容易,有什么问题是要求... – 2016-01-07 02:04:02

7

你想领域,在 “靠山场” 或场如在“属性”... Kotlin真的只有属性。你可以用得到这些对一些类:

MyTest::class.memberProperties 

// or 

MyTest::class.declaredMemberProperties 

而且从Java Class<T>,使用kotlin扩展属性来获取科特林KClass<T>从中你可以继续:

someClassOfMine.javaClass.kotlin.memberProperties 

这就要求kotlin-reflect依赖关系也可以添加到您的构建和类路径中。你会发现KClass

对于财产背后的秘密支持字段很多其他有用的东西,使用Java反射风险自担。

0

很容易现在科特林1.1版,您可以用下面的方法来获取字段科特林

val fields = MyClass.javaClass.kotlin.members 

其中MyClass的是类的选择。

为了使用这个你需要有科特林,反映包含在gradle这个构建文件如下

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

此外,还可以直接获得来自javaClass领域,如果你需要Java字段(在某些情况下有用,因为它们覆盖的范围稍有不同)

val fields = MyClass.javaClass.declaredFields