Kotlin reflect tools for Android
Related Project: Kotlin-Reflect-Tools-For-JVM
This is a tool library for Kotlin to use java reflect APIs in Kotlin simply method on android platform. It can modify or read the top level private visible property value in Kotlin way.
-
Add jcenter repository in your moduel build gradle:
repositories { jcenter() }
-
Apply library in dependency config:
compile 'wu.seal:kotlin-reflect-tools-for-android:1.1.2'
Method | Describe |
---|---|
Any.getPropertyValue(propertyName: String): Any? | get object property value by name |
Any.changePropertyValue(propertyName: String, newValue: Any?) | change object property value by name |
Any.changePropertyValueByPropertyReference(kProperty: KProperty, newValue: Any?) | change object property value by property reference |
Any.invokeMethod(methodName: String, vararg args: Any?): Any? | invoke a method through object by method name |
KProperty.changeValue(thisObj: Any, newValue: Any?) | change current this property valuev |
KProperty.packageLevelGetPropertyValueByName(otherPropertyName: String): Any? | get other package level property value by other package level property name which is in the same kotlin file |
KFunction.packageLevelGetPropertyValueByName(otherPropertyName: String): Any? | get other package level property value by other package level property name which is in the same kotlin file |
KProperty.packageLevelChangePropertyValue(newValue: Any?) | change package level property value |
KProperty.packageLevelChangeOtherPropertyValueByName(otherPropertyName: String, newValue: Any?) | change other package level property value by other package level property name which is in the same kotlin file |
KFunction.packageLevelChangeOtherPropertyValueByName(otherPropertyName: String, newValue: Any?) | change other package level property value by other package level property name which is in the same kotlin file |
KProperty.packageLevelInvokeMethodByName(methodName: String, vararg args: Any?): Any? | invoke package level method by name which is in the same kotlin file |
KFunction.packageLevelInvokeMethodByName(methodName: String, vararg args: Any?): Any? | invoke package level method by name which is in the same kotlin file |
All method don't care what the property or method visibility it is
For example a Kotlin file like this:
val topName = "topSeal"
val topNameWu = "topSealWu"
private val topAge = 666
private fun gotIt() = true
fun funDoubleAge(age: Int): Int {
return age * 2
}
class TestDemo {
private val name = "seal"
val age = 28
private fun isMan(): Boolean {
return true
}
}
Then we could do these :
@Test
fun getPropertyValue() {
val demo = TestDemo()
val nameValue = demo.getPropertyValue("name")
nameValue.should.be.equal("seal")
}
@Test
fun changePropertyValue() {
val demo = TestDemo()
val originValue = demo.age
demo.changePropertyValue("age", 100)
val nowValue = demo.age
originValue.should.not.equal(nowValue)
nowValue.should.be.equal(100)
}
@Test
fun changeValue() {
val demo = TestDemo()
demo::age.changeValue(demo, 100)
demo.age.should.be.equal(100)
}
@Test
fun packageLevelGetPropertyValueByName() {
val topAge = ::topNameWu.packageLevelGetPropertyValueByName("topAge")
topAge.should.be.equal(666)
}
@Test
fun packageLevelInvokeMethodByName() {
val methodResult = ::topName.packageLevelInvokeMethodByName("gotIt") as Boolean
methodResult.should.be.`true`
}
To see more usage cases ,you can have a look at the AndroidTest case in project.
- Welcome to raise any issue.
- Welcome to push a pull request
- Support me by clicking the ⭐ button on the upper right of this page. ✌️