gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:52:28 25 4
gpt4 key购买 nike

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

假设有如下方法:

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

是否可以获取参数名称 nameage在斯卡拉?

更新

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

例如,这是一个网络应用程序,它有一些定义为:
class UsersController extends Controller {
def create(name: String, age: Int) {
// insert the user
}
}

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

在服务器端,当我们得到一个名为 /users/create 的 url ,我们会找到一个方法 create在 Controller 中 UsersController ,现在找到了。然后我必须获取该方法的参数名称,然后我们可以获取它们的值:
val params = getParamsFromRequest()
val method = findMethodFromUrl("/users/create")
val paramNames = getParamNamesOfMethod(method)
val paramValues = getValues(params, paramNames)

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

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

最佳答案

还是非常一个 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 解决已知问题s 在理解中。

请不要太用力,它还很年轻,很脆弱。我当然还没有到接受错误报告的阶段:)

更新

嗯...我知道我说过我不接受错误报告,但是这个似乎非常有用,我还是把它推到了 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

关于scala - 是否可以在scala中获取方法的参数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5191726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com