【发布时间】:2020-04-16 08:46:53
【问题描述】:
我正在尝试在 Kotlin 中创建一个静态方法,该方法允许与 Java 进行适当的互操作。
上下文:我想将 java.lang.reflect.Method 引用传递给 org.springframework.expression.spel.support.StandardEvaluationContext#registerFunction,因此向 Spring 的表达式语言添加自定义功能。
我创建了一个伴生对象:
companion object {
@JvmStatic
fun foo(): Boolean = true
}
并通过
获取参考Companion::foo.javaMethod!!
或
Companion.javaClass.getMethod("foo").modifiers
但是,当我在结果上调用 Modifier.isStatic 时,它会返回 false,当我尝试使用注册函数评估表达式时,我也会得到
org.springframework.expression.spel.SpelEvaluationException:
EL1039E: Only static methods can be called via function references.
The method '…$Companion.foo' referred to by name 'foo' is not static.
我该如何解决这个问题?
【问题讨论】:
-
使用
@JvmStatic使方法在包含类中成为静态,而不是在伴随对象中。使用封闭类作为参考。 -
ContainingClass::foo不起作用,当我尝试Modifier.isStatic(ContainingClass.javaClass.getDeclaredMethod("foo").modifiers)它也是false -
当我使用包级方法时它确实有效
-
不过我很想知道为什么其他方法不起作用
-
您使用的是什么 IDE?我试过了,
ContainingClass.javaClass有一个警告,因为它返回Class<ContainingClass.Companion>,这显然不是你想要的。你应该使用ContainingClass::class.java,它会起作用。
标签: kotlin