我有一个简单的案例类定义如下:
case class Foo(f1 : String, f2:String)
我想使用反射来查询所有声明字段的Foo
类型,获取这些字段的类型,然后获取与这些类型相关联的方法。因此,在此示例中,它将获取字段f1
和f2
,然后对于这些字段,它将确定其类型,在本例中为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)
第一个问题是f1
和f2
在此列表中出现两次的原因?
我无法理解f1
和f2
的类型,所以我尝试了
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)
但这看起来并不像是检索字段f1
和f2
。
如何通过scala反映实现我需要的东西?
答案 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
}