mgo*_*nto 5 reflection macros constructor scala scala-macros
有没有办法使用scala-macros获取给定构造函数的参数名称?
谢谢
请注意,:power
Paul Butcher的答案中的方法允许您访问内部API,如果您尝试在宏中执行此操作(或者在REPL之外的运行时反射中),这可能不是必需的或期望的.
因此,例如调用公共Reflection API 提供isConstructor
的普通旧版本将不起作用 - 您首先需要确保您拥有.与之相似.您当然可以使用非REPL代码转换为内部API,但这很危险且不必要.以下是更好的解决方案:Symbol
members
MethodSymbol
tpe
import scala.reflect.runtime.universe._
class Foo(name: String, i: Int) { def this(name: String) = this(name, 0) }
typeOf[Foo].declaration(nme.CONSTRUCTOR).asTerm.alternatives.collect {
case m: MethodSymbol => m.paramss.map(_.map(_.name))
}
Run Code Online (Sandbox Code Playgroud)
要不就:
typeOf[Foo].declarations.collect {
case m: MethodSymbol if m.isConstructor => m.paramss.map(_.map(_.name))
}
Run Code Online (Sandbox Code Playgroud)
这两个都会给你以下内容:
List(List(List(name, i)), List(List(name)))
Run Code Online (Sandbox Code Playgroud)
如预期的.我在这里使用了运行时反射来简化示例,但是这将与Universe
您Context
在宏中获得的方式完全相同.