You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:15:03