2011-09-19 25 views
31

Scala 2.10 aporta una reflexión distinta a la proporcionada por la JVM (o creo que CLR).¿Qué capacidades de reflexión podemos esperar de Scala 2.10?

¿Qué tenemos en particular que esperar y cómo mejorará en la plataforma?

Por ejemplo, ¿habrá una clase que refleje la convertibilidad del idioma entre los campos y los métodos de acceso, para que pueda iterar sobre las propiedades de un objeto?

+3

Reflexión. Mejora ... hmm. –

+0

Oye, realmente quiero ejemplos, ¡hay una recompensa ahora! –

+0

Bueno, todavía no hay ejemplos reales, y esta pregunta ahora es el éxito principal de Google para 'Scala reflection 2.10' Ho hum, @VonC lo tiene, creo, pero si alguien puede mostrarme el código de nivel de usuario, aún estaría agradecido. –

Respuesta

14

actualización 2012-07-04:

Daniel SOBRAL (también) on SO detalles en su blog "JSON serialization with reflection in Scala! Part 1 - So you want to do reflection?" algunas de las características que vienen con la reflexión:

A modo de recapitulación, se Scala 2.10 ven con una biblioteca de reflexión Scala.
Esa biblioteca es utilizada por el compilador, pero dividida en capas a través de the cake pattern, por lo que diferentes usuarios verán diferentes niveles de detalle, manteniendo los tamaños de jar adecuados al uso de cada uno, y con suerte ocultando detalles no deseados.

La biblioteca de reflexión también se integra con las próximas macro instalaciones , permitiendo a los codificadores emprendedores manipular el código en tiempo de compilación.


actualización 2012-06-14. (de Eugene Burmako):
En Scala 2.10.0-M4, hemos lanzado la nueva API de reflexión que lo más probable que sea en 2.10.0 de final sin cambios significativos.
Más detalles acerca de la API se pueden encontrar:

Extractos:

universos y espejos son entidades ahora separadas:

  • universos artefactos reflexión anfitrión (árboles, símbolos, tipos, etc.), la carga
  • espejos resumen de esos artefactos (por ejemplo, JavaMirror carga cosas usando un cargador de clases y desapilador de anotaciones, mientras que GlobalMirror usa el compilador interno classreader para lograr el mismo objetivo).

API de reflexión pública se divide en scala.reflect.base y scala.reflect.api.

  • La primera representa una instantánea minimalista que es exactamente lo suficiente para compilar árboles y tipos reificados.
  • Para compilar, pero no para analizar, todo lo que sea inteligente (por ejemplo, obtener una firma de tipo) se implementa en scala.reflect.api.

Ambos dominios de reflexión tienen su propio universo: scala.reflect.basis y scala.reflect.runtime.universe.

  • El primero es super ligero y no implica ningún cargadores de clases,
  • mientras que el segundo representa un compilador simplificada.

respuesta inicial, septiembre de 2011:

Se puede ver evoluciones del paquete de reflejar en el Scala GitHub repo, con estas dos confirmaciones muy recientes:

(Liftcode siendo, de acuerdo con this thread, tiene por objeto simplificar "la escritura de código que escribe el código")

La clase scala/reflect/internal/Importers.scala (creada ayer!) Es un buen ejemplo del uso de los última función reflexión.

+0

Ambos enlaces a commit Github ya no existen. –

+1

@ om-nom-nom: enlaces restaurados. Ahora están disponibles en el repositorio [legacy-svn-scala] (https://github.com/scala/legacy-svn-scala). – VonC

+0

@Eugene: gracias por la edición. Me tomé la libertad de agregar algunos enlaces y referencias. – VonC

11

dos enlaces que debería ser de interés:

Personalmente, espero utilizar esto para hacer descubrimiento de extensiones en tiempo de ejecución (es decir, un tipo que amplía un rasgo conocido) y generar formularios de IU y algunas otras cosas a partir de esos.

+0

Gracias, la lista de distribución lleva a la wiki - https://wiki.scala-lang.org/display/SIW/Reflection –

+0

pero la wiki no intenta destilar el hilo. –

+0

y, francamente, ¡todo es completamente opaco para mí! –

5

Con corriente 2.10M4 ya se puede iterar sobre los miembros de una clase:

reflect.runtime.universe.typeOf[MyClass].members.filter(!_.isMethod) 

El código anterior aparece Symbol objetos que representan a los miembros de una clase MyClass que no son métodos. Hay muchas formas en que puedes ajustar esto.

Cuestiones relacionadas