可以在scala中获取方法的参数名吗

可以在scala中获取方法的参数名吗,scala,parameters,Scala,Parameters,据我所知,我们不能在Java中实现这一点。我们可以在scala中这样做吗 假设有如下方法: def insert(name:String, age:Int) { // insert new user } 是否可以在scala中获取参数名称name和age 更新 我想这样做,因为我想自动绑定方法的参数 例如,这是一个web应用程序,它的一些操作定义为: class UsersController extends Controller { def create(name: Str

据我所知,我们不能在Java中实现这一点。我们可以在scala中这样做吗

假设有如下方法:

def insert(name:String, age:Int) {
    // insert new user
}
是否可以在scala中获取参数名称
name
age


更新

我想这样做,因为我想自动绑定方法的参数

例如,这是一个web应用程序,它的一些操作定义为:

class UsersController extends Controller {
    def create(name: String, age: Int) {
          // insert the user
    }
}
客户端单击了创建用户表单的
submit
按钮。url将是
/users/create
,并带有一些参数

在服务器端,当我们获得一个名为
/users/create
的url时,我们将在控制器
UsersController
中找到一个方法
create
,现在找到了一个。然后我必须得到该方法的参数名,然后我们可以得到它们的值:

val params = getParamsFromRequest()
val method = findMethodFromUrl("/users/create")
val paramNames = getParamNamesOfMethod(method)
val paramValues = getValues(params, paramNames)

// then invoke
method.invoke(controller, paramValues)

现在,关键是如何获取方法的参数名

为什么不使用不同的方法名(以反映可能传递的参数)?比如,
craetewithnameandgeandgender
(相当标准的方法)。无论如何,您将无法拥有多个具有相同名称(/arity/参数类型和顺序)和不同参数名称的方法-方法重载不能以这种方式工作。

这个问题对Java中如何实现它有一些见解:

它仍然是非常a,但您应该能够:

import scalaj.reflect._
for {
  clazz <- Mirror.ofClass[UsersController].toSeq
  method <- clazz.allDefs.find(_.name == "insert").toSeq
  params <- method.flatParams
} yield params

你想干什么?得到方法的名称了吗?也许我还没有表达清楚。我使用
reflection
获取方法名,如果我想自动绑定,我必须获取方法名。但是我无法通过java relation获得它们。非常感谢,这非常有帮助。我仍然有一个问题,为什么scala不添加此功能?我不认为这是个问题,如果scala中没有这样的特性,那可能是因为java还没有直接的特性;这可能意味着未来的麻烦。下面是关于Java6中参数名称的讨论,以获取更多信息(我不知道Java7中的特性在哪里):我相信scala确实在编译时为命名参数使用了参数名称。这必须来自类的调试信息。实际上,它来自“scala签名”,它在一个名为
ScalaSig
的注释中被编码为一个字节序列,附在scalac发出的每个类文件上。啊,我被纠正了。听起来也是一个更可靠的解决方案。@Freewind-好的,我已经用一个解决方案更新了我的答案(和项目),解决了从类名字符串构建镜像的问题。
import scalaj.reflect._
for {
  clazz <- Option(Class forName "x.y.UsersController")
  mirror <- Mirror.ofClass(clazz).toSeq
  method <- mirror.allDefs.find(_.name == "insert").toSeq
  params <- method.flatParams
} yield params