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

时间:2016-07-20 03:55:24

标签: java scala reflection converter

Scala反射是针对编译时和运行时设计的。因此,它可以比Java更有效地识别多态方法(参见我之前的帖子In Scala Reflection, How to get generic type parameter of a concrete subclass?),它会遭受类型擦除。

但是,这个方法只能使用Scala反射的镜像来调用,这比它的java对象略慢,我想知道是否有一种简单的方法来转换由Type.members返回的Scala MethodSymbol: / p>

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

有可能吗?

1 个答案:

答案 0 :(得分:1)

这是模拟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: _*)
  }
}