【问题标题】:Getting method parameter types using scala 2.10 reflection API使用 scala 2.10 反射 API 获取方法参数类型
【发布时间】:2022-04-11 07:09:23
【问题描述】:

使用 Java 反射 API,我们可以简单地使用 getParameterTypes 来获取方法的参数类型列表。

这是一个例子:

scala> classOf[String].getMethods.head.getParameterTypes

res8: Array[Class[_]] = Array(class java.lang.Object)

使用新的 Scala 2.10 反射 API 获得相同结果的最佳做法是什么?

【问题讨论】:

    标签: scala reflection


    【解决方案1】:

    这更困难,因为 Scala 反射做得更多,需要更多。例如:

    • 类型不会被删除。类会被删除,但类型不会被删除。
    • Scala 支持命名参数,因此您需要参数的名称。
    • Scala 有没有参数列表的方法。

    所以,考虑到所有这些,这就是你的做法。首先,获取方法:

    val stringMethods: Iterable[MethodSymbol] = typeOf[String].members.collect { 
      case m if m.isMethod => m.asMethod 
    }
    

    Scala 反射还没有提供列出特定类型成员(方法、字段、内部类等)的方法,因此您需要使用通用的members 方法。

    适用于所有类型的成员,members 方法返回 Symbol 的迭代,这是所有符号的最大公分母,因此您需要强制转换为 MethodSymbol 以将生成的符号视为方法。

    现在,假设我们有一个MethodSymbol,我们想要参数的类型。我们可以这样做:

    method.paramLists
    

    【讨论】:

    • 丹尼尔,感谢您的回答。它运行良好,但令我惊讶的是 scala 反射 API 没有封装这个功能,这似乎是基本的。
    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多