的名单是有在科特林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. 如何获得科特林
- 2. 的Java方法科特林反射接受零级阵列
- 3. 与科特林
- 4. 在科特林
- 5. 在科特林
- 6. 在科特林
- 7. 匕首+科特林不注射
- 8. 访问映射条目(科特林)
- 9. 科特林反映proguard的SmallSortedMap
- 10. 使用科特林
- 11. 科特林,对数
- 12. 科特林+春AliasFor
- 13. 使用科特林
- 14. 我有科特林
- 15. 如何科特林
- 16. 科特林:泛型
- 17. 科特林性能
- 18. 得到构造场反射在C#
- 19. 科特林访问为什么在科特林的Java类
- 20. 转换映射到地图列表中科特林
- 21. 科特林构造崩溃
- 22. 方法hashMapOf()在科特林
- 23. 不能在科特林
- 24. 科特林:差异收集
- 25. 科特林 - 没有.value的
- 26. 如何使用科特林
- 27. 确保VAL在科特林
- 28. 科特林扩展功能
- 29. 科特林:内范畴 - 这
- 30. 科特林:在主叫
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