我有这样的代码:
fun main() {
println("Program started")
val obj = MyClass()
obj.printXX()
val objClass : Class<MyClass> = MyClass::class.java //Notice the use of "java" keyword
val xxField = objClass.declaredFields[0]
xxField.isAccessible = true //Crucial feature of java reflection
xxField.set(obj, "xx is hacked and changed")
obj.printXX()
println("End of program")
}
class MyClass {
private val xx = "This is xx" //Inaccessible and Unchangeable
fun printXX() {
println(xx)
}
}
输出:
Program started
This is xx
xx is hacked and changed
End of program
注意"xx"字段声明为"private"(从外部无法进入)它是一个"阀门"(不变的)。然而,通过使用JavaKotlin的反射我可以访问并更改不可更改的字段。
我如何实现相同的结果,只使用Kotlin反射没有Java的帮助?
到目前为止,我认为我需要一个"KMutableProperty1"的实例,但由于xx字段被声明为"值",我只能把我的手放在"KProperty1"实例。Kotlin反射暂时不提供这个选项。Kotlin/JVM反射api有一些辅助方法,比如isAccessible,然后你可以使用java反射来做更高级的事情。
正如您在API文档中看到的,kotlin反射API根据目标平台有不同级别的支持:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.reflect/,只需选择一个您感兴趣的类,比如KProperty,然后在上面关闭JVM。
但总的来说,我不认为这(目前)在JVM以外的其他平台上是可能的。