Skip to content

wuseal/Kotlin-Reflect-Tools-For-Android

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Bintray GitHub stars license

Kotlin-Reflect-Tools-For-Android

Kotlin reflect tools for Android

Related Project: Kotlin-Reflect-Tools-For-JVM

OverView

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.

Usage

  • 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'

APIs

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

Demo

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.

Others

  • Welcome to raise any issue.
  • Welcome to push a pull request

Find me useful ? ❤️

  • Support me by clicking the ⭐ button on the upper right of this page. ✌️