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