2015-02-08 69 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