2016-07-20 21 views
2

Scala反射是爲編譯時間和運行時間而設計的。因此,它可以比Java更有效地識別多態方法(請參閱我以前的文章In Scala Reflection, How to get generic type parameter of a concrete subclass?),這種方法遭受類型擦除。將Scala反射MethodSymbol/MethodSignature轉換爲Java方法的最簡單方法是什麼?

但是,這種方法只能使用Scala反射的鏡像,它比它的java對手稍慢,我想知道是否有一種簡單的方法來轉換由Type.members返回的Scala MethodSymbol:

import import scala.reflect.runtime.universe._ 

val tpe = typeTag[String].tpe 
val methodSymbol = tpe.method("size": Name) 

或MethodSignature,其通過Type.member.SignatureIn(類型):返回:

val methodSignature = methodSymbol.typeSignatureIn(tpe) 

Java方法,可以通過Java反射API被直接調用:

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

這可能嗎?

回答

0

下面是一種模擬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: _*) 
    } 
} 
相關問題