Reflection 如何在Kotlin中声明一组可映射函数?

Reflection 如何在Kotlin中声明一组可映射函数?,reflection,kotlin,Reflection,Kotlin,我想声明一组不是类成员函数的Kotlin函数(即不引用类实例的“静态”函数)。必须以某种方式声明它们,以便我可以在运行时使用反射对其进行迭代 我的第一次尝试是这样编写一个文件Commands.kt: fun a(): Int = 42 fun b(): Int = 23 但是,我没有找到一种方法来迭代该文件中的函数。我知道为了与Java兼容,将生成一个类CommandsKt,其中包含这些函数作为静态方法。但是,我似乎无法在Kotlin中引用该类,我也没有找到一种方法来迭代Kotlin文件的所有

我想声明一组不是类成员函数的Kotlin函数(即不引用类实例的“静态”函数)。必须以某种方式声明它们,以便我可以在运行时使用反射对其进行迭代

我的第一次尝试是这样编写一个文件
Commands.kt

fun a(): Int = 42
fun b(): Int = 23
但是,我没有找到一种方法来迭代该文件中的函数。我知道为了与Java兼容,将生成一个类
CommandsKt
,其中包含这些函数作为静态方法。但是,我似乎无法在Kotlin中引用该类,我也没有找到一种方法来迭代Kotlin文件的所有实体通过反思

我的第二次尝试是使用对象:

object Commands {
    fun a(): Int = 42
    fun b(): Int = 23
}
现在我可以通过
Commands::class.declaredMemberFunctions
迭代成员函数。但是,这些函数仍然是成员函数,而不是“静态”(Java语言)函数(对吧?)


那么,我该如何声明这些函数,以便它们都是静态的,并且可以通过反射来实现呢?

如果您用
@JvmStatic
注释
对象中声明的函数,它们将被编译成静态Java方法。

如果您用
@JvmStatic
注释
对象中声明的函数,则它们将被编译为静态Java方法

我似乎无法引用Kotlin中的那个类

Class.forName(“your.package.CommandsKt”)
将起作用(它返回
java.lang.Class
,而不是
KClass
;我不确定对其调用
.kotlin
是否有效)

我似乎无法引用Kotlin中的那个类


Class.forName(“your.package.CommandsKt”)
将起作用(它返回
java.lang.Class
,而不是
KClass
;我不确定对其调用
.kotlin
是否有效).

调用
.kotlin
可以在任何Java类上工作,无论它是如何编译的。我将使用这个解决方案,代码看起来更干净。@yole很高兴知道。这是我最初的假设,但后来意识到我只是假设,没有机会测试。@yole我接受这个答案时有点太快了。事实上确实如此esn不起作用:
java.lang.UnsupportedOperationException:Kotlin反射中尚不支持包和文件外观。同时,请使用java反射检查此类
。因此,如果我想使用Kotlin反射,另一个答案是正确的。调用
.Kotlin
可以在任何java类上工作,无论它是如何使用c的ompiled。我会使用这个解决方案,代码看起来更干净。@yole很高兴知道。这是我最初假设的,但后来意识到我只是假设,没有机会测试。@yole我接受这个答案时有点太快了。实际上不起作用:
java.lang.UnsupportedOperationException:包和文件外观Kotlin反射尚不支持。同时,请使用Java反射检查此类
。因此,如果我想使用Kotlin反射,另一个答案是正确的。手册如是说。但是,我无法使用
Commands::class.staticFunctions
;相反,它们可以作为
Commands::class.function使用s
并实际获取一个
实例
参数。字节码对每个这样的函数都有声明——静态声明和将
实例
作为参数的声明。我猜Kotlin反射只看到后一个…好吧,我的问题是关于通过反射的可用性,而static方法存在于字节码中。手册如是说。然而,我无法使用
命令::类。静态函数
,取而代之的是,它们可以作为
命令::类。函数
使用,并实际使用一个
实例
参数。字节码对每个这样的函数都有声明-静态声明和一个声明这将
INSTANCE
作为一个参数。我想Kotlin反射只看到后一个…好吧,我的问题是通过反射的可用性,静态方法在字节码中对我没有帮助。