Search code examples
kotlinreflection

How to get a name of member property from the parent object


I want to implement getMemberName function via reflection

data class Inner(val prop: String)
data class Source(
    val member: String,
    val innerMember: Inner
)
fun getMemberName(source: Any, member: Any) : String {
    return "..."
}
fun main() {
  val demo = Source("asd", Inner("asd2"))
  val memberName = getMemberName(demo, demo.member)
  //result: 'member'

  val innerMemberName = getMemberName(demo, demo.innerMember.prop)
  //result: 'innerMember.prop'
}

Maybe somewere in reflection libs exist any common solution?


Solution

  • Here is my solution

    fun getMemberName(source: Any, member: Any, prefix: String = "") : String {
        val res = source::class.declaredMemberProperties.firstOrNull {
            it.getter.call(source) === member
        }?.name
        if(res != null) {
            return prefix + res
        }
        source::class.declaredMemberProperties.filter {
            !it.getter.call(source)!!.javaClass.kotlin.qualifiedName!!.startsWith("kotlin.")
        }.forEach {
            val res = getMemberName(it.getter.call(source)!!, member, prefix + it.name + ".")
            if(res.isNotEmpty()) {
                return prefix + res
            }
        }
        return ""
    }