scala reflection

¿Qué capacidades de reflexión podemos esperar de Scala 2.10?



reflection (3)

Scala 2.10 aporta una reflexión distinta a la proporcionada por la JVM (o creo que CLR).

¿Qué tenemos que esperar en particular 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, de modo que pueda iterar sobre las propiedades de un objeto?


Con 2.10M4 actual, ya puedes iterar sobre los miembros de una clase:

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

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


Dos enlaces que deberían 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 interfaz de usuario y algunas otras cosas a partir de ellos.


actualización 2012-07-04 :

Daniel SOBRAL (también en SO ) detalla en su blog " serialización JSON con reflexión en Scala! Parte 1 - ¿Así que quieres hacer reflexión? " Algunas de las características vienen con reflexión:

Para recapitular, Scala 2.10 vendrá con una biblioteca de reflexión Scala.
Esa biblioteca es utilizada por el propio compilador, pero dividida en capas a través del patrón de tortas , para que los diferentes usuarios vean diferentes niveles de detalle , manteniendo los tamaños de los tarros adecuados al uso de cada uno y ocultando los detalles no deseados.

La biblioteca de reflexión también se integra con las próximas instalaciones macro, lo que permite 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 muy probablemente pasará a 2.10.0-final sin cambios significativos.
Se pueden encontrar más detalles sobre la API:

Extractos:

Universos y espejos son ahora entidades separadas:

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

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

  • El primero representa una instantánea minimalista que es exactamente lo suficiente para construir árboles y tipos cosificados.
  • Para compilar, pero no para analizar: todo lo 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 súper liviano y no incluye ningún cargador de clase,
  • mientras que el último representa un compilador simplificado.

Respuesta inicial, septiembre de 2011:

Puede ver las evoluciones del paquete reflect en el repositorio Scala GitHub , con estos dos compromisos muy recientes:

(El código de elevación, de acuerdo con este hilo , apunta a simplificar "escribir código que escribe código")

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