2012-06-05 2 views
6

Tôi muốn nhận danh sách các đối tượng bên trong của đối tượng scala. Mã mẫu:phát hiện các đối tượng bên trong trong đối tượng 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??? 
    } 
} 

Tôi có thể tìm thấy v và d, nhưng làm thế nào tôi có thể tìm thấy O1 và O2?

+0

Object O1 và O2 được lồng lớp học và không phải là một phần của 'Outer '. Bạn cần phải truy cập như 'Outer.O1.getClass..' –

+0

Cảm ơn bạn đã trả lời, nhưng tôi không muốn đưa chúng vào danh sách theo cách chung chung (không biết tên của chúng trước đây). Tôi đang tìm kiếm somithing như phương thức 'getDeclaredMethods' trong ví dụ. –

Trả lời

6

Với thư viện phản ánh mới trong Scala 2.10 (kể từ Milestone 4) nó có thể để có được các đối tượng bên trong:

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

Đây chính xác là những gì tôi đang tìm kiếm! –

1

Đối tượng O1O2 là các lớp lồng nhau và không phải là một phần của đối tượng Outer.

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

Cảm ơn bạn đã trả lời, nhưng tôi không thể lấy chúng như một Danh sách theo cách chung chung (mà không biết tên của chúng trước đây). Tôi đang tìm kiếm somithing như phương thức 'getDeclaredMethods' trong ví dụ. –

+0

Bạn không thể làm điều đó. lồng nhau Object/class không phải là một phần của đối tượng kèm theo. –