MethodMirror
オブジェクトの特定のメソッドに対して作成されたインスタンスがあるとします。ミラーのフィールドによって、メソッドの戻り値の型とパラメーターに簡単にアクセスできます。しかし、実際には、このメソッドが関数として持つ型を取得する必要があります。
これは、私が達成したいことを説明するのに役立つおもちゃのコード例です。Scala 2.11.6 を使用しています。
import scala.reflect.runtime.universe._
object ForStackOverflow {
object Obj {
def method(x:String, y:String):Int = 0
def expectedRetType():((String, String) => Int) = ???
}
def main(args: Array[String]) {
val mirror:Mirror = runtimeMirror(getClass.getClassLoader)
val instanceMirror = mirror.reflect(Obj)
val methodSymbol:MethodSymbol = instanceMirror.symbol.toType.decl(TermName("method")).asMethod
val methodMirror = instanceMirror.reflectMethod(methodSymbol)
println(methodMirror.symbol.returnType)
println(methodMirror.symbol.paramLists(0).map { x => x.info.resultType }.mkString(", "))
val expectedSymbol:MethodSymbol = instanceMirror.symbol.toType.decl(TermName("expectedRetType")).asMethod
println("I would like to produce from a 'methodMirror' this: "+expectedSymbol.returnType)
}
}
関数を表すType
からインスタンスを生成したいと思います。methodMirror
この例では、 である必要があります(String, String) => Int
。FunctionX
具体的な Scala のクラスにあまり依存しないソリューションが望ましいと思います。