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

时间:2011-03-04 09:11:32

标签: scala parameters

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

假设有以下方法:

def insert(name:String, age:Int) {
    // insert new user
}

是否可以在scala中获取参数名称nameage


更新

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

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

的操作
class UsersController extends Controller {
    def create(name: String, age: Int) {
          // insert the user
    }
}

客户点击了创建用户表单的submit按钮。该网址将为/users/create并且会发送一些参数。

在服务器端,当我们获得名为/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)

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

3 个答案:

答案 0 :(得分:9)

它仍然非常一个work in progress,但你应该能够:

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

对于toSeqs感到抱歉,他们会使用Option解决已知问题。

请不要太强烈地推它,它仍然非常年轻和脆弱。我当然不在我接受错误报告的阶段:)

<强>更新

嗯......我知道我说我不接受错误报告,但是这个看起来非常有用,无论如何我都把它推到了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

答案 1 :(得分:2)

这个问题对如何在Java中完成它有一些了解:Is there a way to obtain names of method parameters in Java?

答案 2 :(得分:1)

为什么不使用不同的方法名称(以反映可能传递的参数)?比如,craeteWithNameAndAgeAndGender(非常标准的方法)。反正你不会有多个具有相同名称的方法(/ arity /参数类型和顺序)以及不同的参数名称 - 方法重载不会这样。