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?
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 ""
}