Scala Class.getFields

Nik*_*kov 8 reflection scala

出于我的应用程序的目的,我需要能够在运行时找到类型(不是实例)的字段列表和这些字段的类型.到目前为止,我只能得到一个包含getter的case类的方法列表,classOf[MyCaseClass].getMethods并且从简单的类中没有任何用处.我错过了什么吗?有没有针对这种目的的反射库?怎么做得好?

Nik*_*kov 17

使用Scala 2.10反射:

scala> import reflect.runtime.{universe => ru}
import reflect.runtime.{universe=>ru}
scala> trait A { val field1: Int; val field2: Char; def meth1: Int }
defined trait A
scala> val fieldSymbols = ru.typeOf[A].members.collect{ case m: ru.MethodSymbol if m.isGetter => m }
fieldSymbols: Iterable[reflect.runtime.universe.MethodSymbol] = List(value field2, value field1)
Run Code Online (Sandbox Code Playgroud)

返回的符号包含所有类型信息,例如:

scala> fieldSymbols.map(_.typeSignature)
res16: Iterable[reflect.runtime.universe.Type] = List(=> scala.Char, => scala.Int)
Run Code Online (Sandbox Code Playgroud)


sch*_*mmd 6

您可能需要查看有关反射scala的文档. getMethods是一种来自Java反射的方法.你在那里找不到什么?来自Javadoc:

  • String getName():以String形式返回此Method对象表示的方法的名称.
  • Class [] getParameterTypes():返回Class对象的数组,这些对象表示此Method对象表示的方法的声明顺序的形式参数类型.
  • Class getReturnType():返回一个Class对象,该对象表示此Method对象表示的方法的正式返回类型.

您可以阅读有关Java反射的更多信息.

请注意,由于擦除,并非所有类型信息都可在运行时使用.