scala - 如何使用 Scala-Macros 获取构造函数参数名称

标签 scala reflection constructor macros scala-macros

有没有办法使用 scala-macros 获取给定构造函数的参数名称?

谢谢

最佳答案

请注意 :power Paul Butcher 的回答中的方法让您可以访问内部 API,如果您尝试在宏中(或在 REPL 之外的运行时反射中)执行此操作,这可能不是必需的或不需要的。

例如调用 isConstructor在一个普通的旧 Symbolmembers 提供在公共(public)反射 API 中不起作用 — 您首先需要确保您有一个 MethodSymbol .与 tpe 类似.您当然可以在非 REPL 代码中转换为内部 API,但这是危险且不必要的。以下是更好的解决方案:

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))
}

要不就:
typeOf[Foo].declarations.collect {
  case m: MethodSymbol if m.isConstructor => m.paramss.map(_.map(_.name))
}

这两个都将为您提供以下信息:
List(List(List(name, i)), List(List(name)))

如预期的。我在这里使用了运行时反射来简化示例,但这与 Universe 的工作方式完全相同。你从你的Context在宏中。

关于scala - 如何使用 Scala-Macros 获取构造函数参数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13814288/

相关文章:

Scala Spark 矩阵操作

java - play sbt 无法在 scala docker 镜像上启动

java - ReflectionUtils 如何替换已弃用的方法?

c++ - 如何初始化共享复杂初始化代码的多个常量成员变量?

Angular - 如果它没有任何逻辑,我们还需要一个构造函数吗

xml - scala 字符串到 scala.xml.Elem

scala - 关于缩写 map 的困惑

java - 检查文件是否在文件夹中并希望创建该文件的实例(如果存在)

c# - 简单反射(reflection)题 C#

c++ - C++程序在Visual Studio 2010中编译,但不能在Mingw中编译