fwi*_*lhe 16 reflection jvm kotlin
foo.getClass().getFields()Kotlin中的java反射是否相同?当我知道它的名字时,我只能发现我可以访问一个字段,但我想以通用的方式处理字段.
Jay*_*ard 11
你想要"支持字段"中的字段或"属性"中的字段...... Kotlin真的只有属性.你可以使用以下方法获得这些课程:
MyTest::class.memberProperties
// or
MyTest::class.declaredMemberProperties
Run Code Online (Sandbox Code Playgroud)
从Java中Class<T>,使用kotlinextension属性来获取Kotlin KClass<T>,您可以从中继续:
someClassOfMine.javaClass.kotlin.memberProperties
Run Code Online (Sandbox Code Playgroud)
这需要将kotlin-reflect依赖项添加到构建和类路径中.你会发现许多其他有用的东西KClass
对于属性后面的秘密支持字段,使用Java反射需要您自担风险.
现在使用 Kotlin v1.1 非常容易,您可以使用以下方法获取 kotlin 中的字段
val fields = MyClass.javaClass.kotlin.members
Run Code Online (Sandbox Code Playgroud)
其中 MyClass 是您选择的类。
为了使用它,你需要将 kotlin-reflect 包含在你的 gradle 构建文件中,如下所示
compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
Run Code Online (Sandbox Code Playgroud)
此外,如果您需要 java 字段,也可以直接从 javaClass 获取字段(在某些情况下很有用,因为这些字段覆盖的范围略有不同)
val fields = MyClass.javaClass.declaredFields
Run Code Online (Sandbox Code Playgroud)
在 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(", ")
}
}
Run Code Online (Sandbox Code Playgroud)
我们来测试一下:
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)
Run Code Online (Sandbox Code Playgroud)
结果:
Fields: anotherVar, emptyClass, emptyTrait, contant, $kotlinClass
anotherVar: null
anotherVar: 10
Run Code Online (Sandbox Code Playgroud)
有用 )
| 归档时间: |
|
| 查看次数: |
12774 次 |
| 最近记录: |