2011-03-04 79 views
3

据我所知,我们不能用Java来完成。我们可以在scala中做到这一点吗?是否可以在scala中获取方法的参数名称

假设有一个方法如下:

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

是否有可能得到的参数名称name和斯卡拉age


UPDATE

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

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

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

客户机点击了创建用户形式的submit按钮。该网址将是/users/create,并带有一些参数发送。

在服务器端,当我们得到一个名为/users/create的网址时,我们会在控制器UsersController中找到一个方法create,现在找到一个。然后,我必须得到该方法的参数名称,那么我们就可以得到他们的价值观:

val params = getParamsFromRequest() 
val method = findMethodFromUrl("https://stackoverflow.com/users/create") 
val paramNames = getParamNamesOfMethod(method) 
val paramValues = getValues(params, paramNames) 

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

现在的关键是如何让一个方法的参数名称?

+0

你想做什么就做什么?获取方法的名称? – Fabian 2011-03-04 09:12:53

回答

8

它仍然非常一个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来理解已知问题。

请不要推它很难,它仍然非常年轻和脆弱。我当然不会在目前阶段,我会接受的bug报告:)

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 
+0

非常感谢!它的工作原理:) – Freewind 2011-03-04 12:31:07

+0

@Freewind - 好吧,我已经更新了我的答案(和项目),解决了从类名字符串构建镜像的问题。 – 2011-03-04 14:28:11

1

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

+0

也许我没有清楚表达。我使用'reflection'来获取方法名称,如果我想自动绑定,我必须获取方法名称。但我无法通过java relection获取它们。 – Freewind 2011-03-04 09:42:30

2

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

+0

非常感谢,这非常有帮助。我仍然有一个问题,为什么不scala添加此功能?我不认为这是一个问题。 – Freewind 2011-03-04 10:12:22

+1

如果在scala中没有这样的特性,那可能是因为java直接还没有;这可能意味着未来的麻烦。以下是关于Java 6中参数名称的一个讨论,以便更深入地了解(我不知道Java 7中的功能在哪里):http://paulhammant.com/blog/parameter-names-for-java6-answer.html 我相信scala在编译时使用参数名称来命名参数。这必须来自该类的调试信息。 – thoredge 2011-03-04 10:25:27

+0

实际上,它来自“scala签名”,它被编码为scalac发出的每个类文件附加的名为ScalaSig的注释中的字节序列。 – 2011-03-04 14:30:28

相关问题