Scala反射:如何找到具有指定类型的val?

时间:2014-02-20 17:37:17

标签: scala reflection

我正在尝试使用反射实现深度等于比较。 为此,我需要在运行时给出的对象中找到列表(在下面的示例中,此对象称为Foo)。

我的感觉是下面的代码朝着正确的方向发展,但我无法弄清楚要放入??? what should go here ???部分的内容,以致lists包含指向list1的符号和list2

如果我只是将listType放入??? what should go here ???,那么lists就会变空。

(下面的代码取自我正在尝试可能的解决方案的IntelliJ Scala工作表。)

import scala.reflect.runtime.universe._
import java.util
class Foo{
  val one=1
  val list1=new util.ArrayList[Int]
  val list2=new util.ArrayList[Int]  
}
val foo=new Foo
val m= runtimeMirror(getClass.getClassLoader)
val theType =m.reflect(foo).symbol.toType
val listType = typeOf[util.List[_]]
val lists=theType.members.filter(  _.typeSignature == ??? what should go here ??? )

1 个答案:

答案 0 :(得分:2)

如果您只对val感兴趣:

val lists = theType.members.filter {
  m => m.isTerm && m.asTerm.isVal && m.typeSignature <:< listType
}

请注意,这仅包括可访问的成员。