2012-06-05 70 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

你不能那樣做。嵌套的對象/類不是封閉對象的一部分。 –