【问题标题】:Static methods in Kotlin as static method in JavaKotlin 中的静态方法作为 Java 中的静态方法
【发布时间】: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


【解决方案1】:

这样对我有用:

class C {
    companion object {
        @JvmStatic
        fun foo(): Boolean = true
    }
}

val method = C::class.java.getDeclaredMethod("foo")

Modifier.isStatic(method.modifiers) // true

注意C::class.javaC.javaClass 是不同的东西:前者返回Class<C>,后者返回Class<C.Companion>

【讨论】:

  • 很好,这确实有效!缺点是 :: 运算符不适用于此,而它确实适用于包级方法。所以我可以使用::foo.javaMethodCompanion::foo.javaMethod(提供非静态函数),但我不能说ContainingClass::foo
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 2022-12-12
相关资源
最近更新 更多