2016-07-20 5 views
2

スカラ反射は、コンパイル時と実行時の両方に設計されています。したがって、型の削除に悩むJava(以前の投稿In Scala Reflection, How to get generic type parameter of a concrete subclass?を参照)よりも多型メソッドをより効果的に識別できます。ScalaのリフレクションMethodSymbol/MethodSignatureをJavaメソッドに変換する最も簡単な方法は何ですか?

しかし、このメソッドは、Javaの対応オブジェクトよりもわずかに遅いScala reflectionのミラーを使用してのみ呼び出すことができます.ScalaのMethodSymbolを簡単に変換できるかどうかを知りたい場合は、Type.membersから返されます。

import import scala.reflect.runtime.universe._ 

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

又はType.member.SignatureIn(タイプ)によって返されるMethodSignature、:直接JavaリフレクションAPIを介して呼び出すことができるJavaメソッドへ

val methodSignature = methodSymbol.typeSignatureIn(tpe) 

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

可能ですか?

答えて

0

Javaスタイルの呼び出しをシミュレートする方法の1つです。

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: _*) 
    } 
} 
関連する問題