Kotlin如何通过反射获取静态函数及伴生、单例对象函数
问题原因
Kotlin 的伴生对象函数、单例对象函数默认不会编译为 JVM 层面的静态方法,只有添加了@JvmStatic注解的方法才会被标记为 static 修饰,所以你原来仅通过Modifier.isStatic判断的逻辑自然会过滤掉这部分方法。
修改方案
你需要额外增加Kotlin反射逻辑,获取类对应的伴生对象、单例对象的成员方法,再和Java静态方法合并即可,修改后的代码如下:
import kotlin.reflect.full.companionObjectInstance import kotlin.reflect.full.objectInstance import java.lang.reflect.Method import java.lang.reflect.Modifier // 你可以根据自己的需求调整Something的结构,这里示例保留方法和所属实例(方便后续调用方法) data class Something(val method: Method, val instance: Any? = null) fun staticsFromClass(clazz: Class<*>): List<Something> { val result = mutableListOf<Something>() // 保留原有Java静态方法的逻辑 clazz.methods.filter { Modifier.isStatic(it.modifiers) } .mapTo(result) { Something(it) } // 处理Kotlin类的情况 val kClass = clazz.kotlin // 1. 处理单例对象类的方法 kClass.objectInstance?.let { obj -> obj::class.java.declaredMethods // 过滤掉kotlin生成的内置方法,可选,根据你的需求调整 .filter { !it.name.contains("$") && !Modifier.isStatic(it.modifiers) } .mapTo(result) { Something(it, obj) } } // 2. 处理伴生对象的方法 kClass.companionObjectInstance?.let { companionObj -> companionObj::class.java.declaredMethods .filter { !it.name.contains("$") && !Modifier.isStatic(it.modifiers) } .mapTo(result) { Something(it, companionObj) } } // 可选:去重,避免@JvmStatic方法同时出现在静态方法列表和伴生对象方法列表 return result.distinctBy { it.method } }
注意事项
- 上述代码用到了Kotlin反射API,需要在项目中引入
kotlin-reflect依赖才能正常运行 - 如果你不需要保留方法所属的实例用于后续调用,可以直接修改Something结构仅保留method对象即可
- 代码中的过滤内置生成方法的逻辑可根据你的业务需求调整,如果你需要拿到所有生成方法直接删除filter条件即可
内容的提问来源于stack exchange,提问作者Shazniq
相关产品推荐
相关产品推荐

