2012-06-05 45 views
6

我想获取scala对象的内部对象列表。示例代码:检测scala对象中的内部对象

object Outer { 
    val v = "-" 
    def d = "-" 
    object O1 
    object O2 
} 

object Main { 
    def main(args: Array[String]) { 
    Outer.getClass.getDeclaredMethods.map(_.getName) foreach println // prints d and v 
    // Outer.getClass.get ... Objects??? 
    } 
} 

我可以找到v和d,但是如何找到O1和O2?

+0

对象O1和O2被嵌套类和不外的'的一部分'。你需要访问像'Outer.O1.getClass..' –

+0

谢谢你的回答,但我不想让他们作为一个通用的方式列表(不知道他们的名字之前)。我正在寻找像在示例中的'getDeclaredMethods'方法一样的somithing。 –

回答

6

随着Scala中2.10将新反射库(因为里程碑4),能够得到内的对象:

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

scala> val outer = u.typeOf[Outer.type] 
outer: reflect.runtime.universe.Type = Outer.type 

scala> val objects = outer.declarations.filter(_.isModule).toList 
objects: List[reflect.runtime.universe.Symbol] = List(object O1, object O2) 
+0

这正是我一直在寻找的! –

1

对象O1O2是嵌套类,不是Outer对象的一部分。

println(Outer.O1.getClass.getName) //Outer$O1$ 
    println(Outer.getClass.getName) //Outer$ 
    println(Outer.O2.getClass.getName) //Outer$O2$ 
+2

谢谢你的回答,但我不想以通用的方式将它们作为List(不知道它们的名称)。我正在寻找像在示例中的'getDeclaredMethods'方法一样的somithing。 –

+0

你不能那样做。嵌套的对象/类不是封闭对象的一部分。 –