我有一个带有函数的类
case class FunctionParser1Arg[T, U](func:(T => U))
def testFunc(name1:String):String = name1
val res = FunctionParser1Arg(testFunc)
我想从案例类内部了解函数的类型签名信息。我想知道参数名称和类型。我已经成功地使用运行时镜像对象找到了类型,但没有找到名称。有什么建议么?
我有一个带有函数的类
case class FunctionParser1Arg[T, U](func:(T => U))
def testFunc(name1:String):String = name1
val res = FunctionParser1Arg(testFunc)
我想从案例类内部了解函数的类型签名信息。我想知道参数名称和类型。我已经成功地使用运行时镜像对象找到了类型,但没有找到名称。有什么建议么?
好的,假设您得到了实例func
指向的符号:
import scala.reflect.runtime.universe._
import scala.reflect.runtime.{currentMirror => m}
val im = m reflect res.func // Instance Mirror
您可以apply
从其类型成员中获取该方法:
val apply = newTermName("apply")
val applySymbol = im.symbol.typeSignature member apply
既然我们知道它是一个方法,就让它成为一个方法符号:
val applyMethod = applySymbol.asMethod
通过 可以找到它的参数paramss
,我们知道一个参数列表中只有一个参数,所以我们可以得到第一个参数列表的第一个参数:
val param = applyMethod.paramss(0)(0)
那么你要求的是:
val name = param.name.decoded // if you want "+" instead of "$plus", for example
val type = param.typeSignature
您可能认为这是错误的答案,因为您得到x$1
的不是name1
,但是传递给构造函数的不是命名函数 testFunc
,而是一个匿名函数,表示通过称为eta 扩展的过程创建的该方法。找不到方法的参数名是因为无法传递方法。
如果这是您需要的,我建议您改用宏。使用宏,您将能够准确地看到在编译时传递的内容并从中获取名称。