将 Scala 反射 MethodSymbol/MethodSignature 转换为 Java 方法的最简单方法是什么?



Scala反射是为编译时和运行时设计的。因此,它可以比Java更有效地识别多态方法(请参阅我之前的文章《在Scala Reflection中,如何获得具体子类的泛型类型参数?》),Java会遭受类型擦除。

然而,这个方法只能使用Scala反射的镜像调用,它比java反射的镜像稍慢,我想知道是否有一种简单的方法可以转换Scala MethodSymbol,它由Type.members返回:

import import scala.reflect.runtime.universe._
val tpe = typeTag[String].tpe
val methodSymbol = tpe.method("size": Name)

或MethodSignature,由Type.member返回。SignatureIn(Type):

val methodSignature = methodSymbol.typeSignatureIn(tpe)

到可以通过Java反射API直接调用的Java方法:

val size = method.invoke("abc")
size: Int = 3

有可能吗?

这里有一种模拟Java风格调用的方法。

object ScalaMethodUtil {
  import scala.reflect.runtime.universe._
  def invoke(m: MethodSymbol)(o: Any)(args: Any*): Any = {
    val mirror = runtimeMirror(o.getClass.getClassLoader).reflect(o)
    mirror.reflectMethod(m)(args: _*)
  }
}

相关内容

  • 没有找到相关文章

最新更新