可以在scala中获取方法的参数名吗
据我所知,我们不能在Java中实现这一点。我们可以在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
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