据我所知,我们不能用
Java做到这一点.我们可以在scala中执行此操作吗?
假设有一种方法如下:
def insert(name:String,age:Int) { // insert new user }
是否可以在scala中获取参数名称和年龄?
UPDATE
我想这样做,因为我想自动绑定方法的参数.
例如,这是一个Web应用程序,它有一些定义为:
class UsersController extends Controller { def create(name: String,age: Int) { // insert the user } }
客户点击了创建用户表单的提交按钮. url将是/ users / create并且会发送一些参数.
在服务器端,当我们得到一个名为/ users / create的url时,我们会在控制器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感到抱歉,他们将在for-comprehension中使用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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。