加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:54:20 所属栏目:安全 来源:网络整理
导读:有没有办法使用 scala-macros获取给定构造函数的参数名称? 谢谢 解决方法 请注意,Paul Butcher的答案中的:power方法允许您访问内部API,如果您尝试在宏中执行此操作(或者在REPL之外的运行时反射中,这可能不是必需的或期望的) ). 因此,例如,在公共Reflection
有没有办法使用 scala-macros获取给定构造函数的参数名称?

谢谢

解决方法

请注意,Paul Butcher的答案中的:power方法允许您访问内部API,如果您尝试在宏中执行此操作(或者在REPL之外的运行时反射中,这可能不是必需的或期望的) ).

因此,例如,在公共Reflection API中的成员提供的普通旧符号上调用isConstructor将无法工作 – 首先需要确保您具有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)))

如预期的.我在这里使用了运行时反射来简化示例,但是这将与您从宏中的Context获得的Universe完全相同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读