是否可以在scala中获取方法的参数名称

Fre*_*ind 3 parameters scala

据我所知,我们不能用Java做到这一点.我们可以在scala中执行此操作吗?

假设有一种方法如下:

def insert(name:String, age:Int) {
    // insert new user
}
Run Code Online (Sandbox Code Playgroud)

是否可以获取参数名称nameagescala?


UPDATE

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

例如,这是一个Web应用程序,它有一些定义为:

class UsersController extends Controller {
    def create(name: String, age: Int) {
          // insert the user
    }
}
Run Code Online (Sandbox Code Playgroud)

客户点击submit了创建用户表单的按钮.网址将/users/create与一些参数发送.

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

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

// then invoke
method.invoke(controller, paramValues)
Run Code Online (Sandbox Code Playgroud)

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

Kev*_*ght 9

它仍然一项正在进行中工作,但您应该能够:

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

对此toSeqs感到抱歉,他们将围绕一个已知问题使用Options进行理解.

请不要用力,它仍然非常年轻和脆弱.我当然不会在我接受错误报告的阶段:)

UPDATE

嗯......我知道我说我不接受错误报告,但这个看起来非常有用,无论如何我都把它推到了github.

要动态地完成工作(从String类名称):

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
Run Code Online (Sandbox Code Playgroud)