2016-07-20 1 views
2

Scala reflection ist sowohl für die Kompilierungszeit als auch für die Laufzeit ausgelegt. So kann es die polymorphe Methode effektiver als Java identifizieren (siehe meinen vorherigen Beitrag In Scala Reflection, How to get generic type parameter of a concrete subclass?), der unter dem Typ Löschen leidet.Was ist der einfachste Weg, um eine Scala Reflection MethodSymbol/MethodSignature in eine Java-Methode zu konvertieren?

Diese Methode kann jedoch nur mit dem Spiegel von Scala reflection aufgerufen werden, der etwas langsamer als sein Java-Gegenstück ist. Ich würde gerne wissen, ob es eine einfache Methode zur Konvertierung von Scala MethodSymbol gibt, die von Type.members zurückgegeben wird:

import import scala.reflect.runtime.universe._ 

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

oder MethodSignature, die durch Type.member.SignatureIn (Type) zurückgeführt wird:

val methodSignature = methodSymbol.typeSignatureIn(tpe) 

auf eine Java-Methode, die direkt über Java API Reflexion aufgerufen werden können:

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

Ist es möglich?

Antwort

0

Hier ist eine Möglichkeit, Java-Stil-Aufruf zu simulieren.

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: _*) 
    } 
} 
Verwandte Themen