Related Project: Kotlin-Reflect-Tools-For-Android
This is a tool library for Kotlin to use java reflect APIs in Kotlin simply method.It can modify or read the top level private visible property value in Kotlin way.
-
Note: This tools only availible for JVM not fit for android platform ,If you use on Android platform, Please use
-
Add jcenter repository in your moduel build gradle:
repositories { jcenter() }
-
Apply library in dependency config:
compile 'wu.seal:kotlin-reflect-tools-for-jvm: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.changePropertyValueIgnoreItsType(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 test 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. ✌️