加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 10:07:23 所属栏目:安全 来源:网络整理
导读:据我所知,我们不能用 Java做到这一点.我们可以在scala中执行此操作吗? 假设有一种方法如下: def insert(name:String,age:Int) { // insert new user} 是否可以在scala中获取参数名称和年龄? UPDATE 我想这样做,因为我想自动绑定方法的参数. 例如,这是一个
据我所知,我们不能用 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读