从scala函数获取参数名称

时间:2011-01-30 05:52:49

标签: scala parameters manifest

trait PublicApi{ 

  def sayHi(from:String,content:String) 

} 

我知道java中不可能在运行时获取“from”和“content” 但scala清单可以帮助我吗?比如定义

trait PublicApi{ 

  def sayHi(from:String,content:String)(m:Manifest) 

} 

调用m.methodErasure.getArgumentName(0)将返回“from”

2 个答案:

答案 0 :(得分:8)

在目前的实施中,ClassManifest完全是type reification,并且对参数名称一无所知。
除非你:

  • 在编译时添加参数名称的元数据
  • 或使用 ASM 的缩减版本(Java字节码操作和分析框架)在运行时从类中提取调试信息

,正如paranamer所做的那样(如评论中提到的Monkey),您将不会获得有关参数名称的任何信息(至少在Java 8.0之前没有,即使它{{3} }:was initially mentioned for Java6!仍在进行中)

答案 1 :(得分:7)

Scala“签名” DOES 包含这些参数名称,正如您所推测的那样。毕竟,它们必须存储某处才能使命名/默认参数正常工作。您也可以使用scalap查看这些名称。

请随意查看我在a reflection library的初步工作。

这是一项正在进行中的工作,我绝对不能保证当前的功能集或正确性,但可能会让您对所涉及的内容有所了解 - 您甚至可以使用它来提取当前的参数名称州。这也是我正在积极努力的事情,所以随着时间的推移,你可以期待它有所改善......