的名單是有在科特林Java反射foo.getClass().getFields()
等效?我只能發現,當我知道它是名字時我可以訪問一個字段,但我想以通用的方式處理字段。科特林反射得到場
Q
科特林反射得到場
12
A
回答
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
它的工作原理)
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
相關問題
- 1. 的Java方法科特林反射接受零級陣列
- 2. 在科特林
- 3. 匕首+科特林不注射
- 4. 科特林反映proguard的SmallSortedMap
- 5. 如何科特林
- 6. 科特林,對數
- 7. 使用科特林
- 8. 使用科特林
- 9. 科特林訪問爲什麼在科特林的Java類
- 10. 轉換映射到地圖列表中科特林
- 11. 科特林得到的jQuery的目標點擊
- 12. 得到錯誤,同時具有getter和setter在科特林
- 13. 科特林:如何構造
- 14. 轉換Array對科特林
- 15. 例如在科特林
- 16. 呼叫科特林從Java
- 17. 過時科特林運行
- 18. 與科特林匕首2
- 19. 的foreach在科特林
- 20. 科特林:內範疇 - 這
- 21. 確保VAL在科特林
- 22. 嵌套接口科特林
- 23. 科特林擴展功能
- 24. 在科特林功能
- 25. 啓用並在科特林
- 26. 科特林與片段
- 27. 多線程在科特林
- 28. 科特林函數參照
- 29. 繼承在科特林
- 30. 誤差java8和科特林
AFAIK它正在開發中。隨意明星或投票相關的問題(https://youtrack.jetbrains.com/issue/KT-6570)獲取更新。 – bashor 2015-02-08 12:09:46
謝謝,這回答我的問題。我找不到按鈕「接受」你回答.. – fwilhe 2015-02-08 14:35:07
不客氣!評論無法標記。 – bashor 2015-02-08 20:39:50