2012-06-05 18 views
6

Quiero obtener una lista de objetos internos de un objeto scala. Código de muestra:detectar objetos internos en un objeto 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??? 
    } 
} 

Puedo encontrar v y d, pero ¿cómo puedo encontrar O1 y O2?

+0

clases de objetos O1 y O2 están anidados y no son parte de 'externo '. Necesita acceder como 'Outer.O1.getClass..' –

+0

Gracias por su respuesta, pero quiero obtenerlos como una lista de una manera genérica (sin saber sus nombres antes). Estoy buscando somithing como el método 'getDeclaredMethods' en el ejemplo. –

Respuesta

6

Con la nueva librería reflejo en Scala 2,10 (desde Milestone 4) es posible obtener los objetos internos:

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

¡Esto es exactamente lo que estaba buscando! –

1

Objeto O1 y O2 son clases anidadas y no son parte de Outer Objeto.

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

Gracias por su respuesta, pero quiero obtenerlos como una lista de una manera genérica (sin saber sus nombres antes). Estoy buscando somithing como el método 'getDeclaredMethods' en el ejemplo. –

+0

No puedes hacer eso. Objeto/clase anidada no es parte del objeto adjunto. –

Cuestiones relacionadas