【发布时间】:2011-11-30 05:39:15
【问题描述】:
我们可以使用反射来获取方法名,如下:
object Foo { def bar(name:String, age:Int) = {} }
val foo = Foo.getClass
val methods = foo.getMethods.filter(_.getName.startsWith("b"))
methods.foreach(m => println(m.getName))
我现在需要获取参数类型和名称。
- 参数名称是否存储在字节码中?如果答案是肯定的,如何访问它们?
- 如果上面的答案是否定的,我们可以使用注释以某种方式存储名称吗?
- 谁能给出一个例子来阅读这些类型,以及如何使用它们。我只对具有
String和/或Array[String]类型参数的函数感兴趣。
[EDIT:] Java 版本的解决方案也可以。
[编辑:] 注释似乎是一种方法。但是,Scala 注释支持并不是那么好。 Related SO question.
【问题讨论】:
-
对于 (1),我相信答案是否定的,因为 Java 类文件不存储名称。 (2) 似乎可能,但我不知道。对于 (3),请记住实际上不是整个类型,只是存储类型构造函数,因为擦除。再次注释可能会解决这个问题,但尝试不使用反射的系统可能会更好?根据我的经验,虽然反射有时很方便,但你最终会后悔的(而且现在它甚至听起来都不方便)。
-
名称似乎存储在字节码中,因为当我使用 Java 中的 Scala jar(没有 Scala 源代码)时,Eclipse/Netbeans IDE 代码完成会显示名称。
-
@Jus12 不过,这不是字节码的要求,可能是由于存在调试符号。
javap -l将打印出一个符号表(如果存在);您可以通过测试java和java -g:vars来验证差异,以查看带有和不带有符号名称信息的类文件。 -
我出于其他原因创建它,但它也涵盖了问题:gist.github.com/1257784 应该注意的是,它仅适用于 Scala 编译器的主干版本。
标签: java scala reflection