次のコードを検討してください。
object Foo{def foo(a:Int):List[(String, Int)] = ???}
class Bar{def bar(a:Int, b:Any):Option[(String, Long)] = ???}
オブジェクトまたはクラスのいずれかが与えられた場合、まずメソッド名を見つける必要があります (それほど難しくないようです)。
その後、各メソッドについて、Scalaの戻り値の型 (Java のものではない) の文字列の説明を見つけたいと思います。たとえば、 forFoo.foo
には String が必要で、List[(String, Int)]
forBar.bar
には String が必要Option[(String, Long)]
です。
これとこのチュートリアルを見ましたが、理解できませんでした。
編集:コメントに基づいて試したのは次のとおりです。
class RetTypeFinder(obj:AnyRef) {
import scala.reflect.runtime.{universe => ru}
val m = ru.runtimeMirror(getClass.getClassLoader)
val im = m.reflect(obj)
def getRetType(methodName:String) = {
ru.typeOf[obj.type].declaration(ru.TermName(methodName)).asMethod.returnType
}
}
object A { def foo(a:Int):String = ??? } // define dummy object
class B { def bar(a:Int):String = ??? } // define dummy class
val a = new RetTypeFinder(A)
a.getRetType("foo") // exception here
val b = new RetTypeFinder(new B)
b.getRetType("bar") // exception here
私が得るエラーは次のとおりです。
scala.ScalaReflectionException: <none> is not a method
at scala.reflect.api.Symbols$SymbolApi$class.asMethod(Symbols.scala:228)
at scala.reflect.internal.Symbols$SymbolContextApiImpl.asMethod(Symbols.scala:84)
at cs.reflect.Test.getRetCls(Test.scala:11)
...
ただし、これは機能します(REPLで試しました):
import scala.reflect.runtime.{universe => ru}
val m = ru.runtimeMirror(getClass.getClassLoader)
object A { def foo(a:Int):String = ??? } // define dummy object
val im = m.reflect(A)
ru.typeOf[A.type].declaration(ru.TermName("foo")).asMethod.returnType
class B { def bar(a:Int):String = ??? } // define dummy class
val im = m.reflect(new B)
ru.typeOf[B].declaration(ru.TermName("bar")).asMethod.returnType
どのオブジェクト/クラスが渡されるかが事前にわからない最初の方法で使用する必要があります。どんな助けでも大歓迎です。