获取案例类中所有字段及其方法的类型列表

时间:2016-04-11 14:14:08

标签: scala

我有一个简单的案例类定义如下:

case class Foo(f1 : String, f2:String)

我想使用反射来查询所有声明字段的Foo类型,获取这些字段的类型,然后获取与这些类型相关联的方法。因此,在此示例中,它将获取字段f1f2,然后对于这些字段,它将确定其类型,在本例中为String,然后获取与String关联的所有方法{1}}输入。

我尝试了以下内容:

scala> import reflect.runtime.{universe => ru}
import reflect.runtime.{universe=>ru}

scala> case class Foo(f1 : String, f2:String)
defined class Foo

scala> ru.typeOf[Foo].declarations
warning: there was one deprecation warning; re-run with -deprecation for details
res30: reflect.runtime.universe.MemberScope = SynchronizedOps(value f1, value f1, value f2, value f2, constructor Foo, method copy, method copy$default$1, method copy$default$2, method productPrefix, method productArity, method productElement, method productIterator, method canEqual, method hashCode, method toString, method equals)

第一个问题是f1f2在此列表中出现两次的原因?

我无法理解f1f2的类型,所以我尝试了

scala> ru.typeOf[Foo].getClass.getFields
res31: Array[java.lang.reflect.Field] = Array(public final scala.reflect.api.Universe scala.reflect.api.Types$TypeApi.$outer)

但这看起来并不像是检索字段f1f2

如何通过scala反映实现我需要的东西?

1 个答案:

答案 0 :(得分:1)

  

第一个问题是为什么f1和f2在这个列表中出现两次?

字段及其getter方法。

  

ru.typeOf [富] .getClass.getFields

typeOf[Foo]返回Type。因此typeOf[Foo].getClass将返回一个实现Type而非Foo的类。只需写下classOf[Foo].getDeclaredFields即可。或者,如果您想使用scala-reflect类型:

ru.typeOf[Foo].declarations.collect { 
  case t: TermSymbol if t.isCaseAccessor => t 
}