¿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:
- La discusión de la lista de correo Scala-Internals en la API de reflexión.
- El api doc de construcción nocturna para 2.10-SNAPSHOT.
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:
- SO answer Obtiene instancia de objeto compañero con la nueva API de reflexión de Scala
- Scala Reflection SIP, junio de 2012 por Martin Odersky ( SIP , en realidad, " Proceso de mejora de Scala ")
- ruta de resumen y migración desde M3
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 unclassreader
compiladorclassreader
para lograr el mismo objetivo).La API pública de reflexión se divide en
scala.reflect.base
yscala.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
yscala.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:
- Cambia a Liftcode para usar una nueva semántica de reflexión, donde un compilador usa la verificación de tipos .
- Comencé a trabajar en la caja de herramientas del compilador que puede compilar árboles reflejados en tiempo de ejecución .
(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.