2010-02-04 10 views
12

¿Alguien sabe el estado de una API de reflexión con todas las características para Scala?Reflection API for Scala

Sé que puede usar la API de reflexión de Java para hacer cosas simples, pero esto no funciona bien con las funciones de idioma de Scala. Encontré un interesting article que describe una API experimental de Scala Mirroring, pero hasta donde sé, esto todavía es experimental. También encontré mención de un ScalaSigParser, pero parece ser un nivel bastante bajo.

Esto es más una curiosidad que otra cosa ya que actualmente estoy jugando con Scala. Pensé que la respuesta a esta pregunta también podría ser útil para otros interesados ​​en Scala.

+0

¿Puede ser más específico sobre lo que quiere que haga la reflexión? Puede usar rutinas en scala.tools.nsc para ayudar con el cambio de nombre, y algunas cosas simplemente no se reflejan bien, realmente necesita compilación para ayudarlo porque no se trata solo de llamar a los métodos existentes (por ejemplo, si necesita un nuevo cierre). –

+0

Primero, estaba pensando que sería bueno crear instancias de clases con parámetros nombrados de modo que no tenga que preocuparse por el orden de los parámetros; podría tratarse de un reemplazo inmutable del patrón de estilo JavaBean. También estaba pensando que sería bueno poder ver la estructura de una clase en lo que respecta a las funciones de Scala. es decir. consígame todos los ctors - encuentre el primario - llámelo. O responda preguntas como este campo es val o var. Además, sería bueno usar una API de reflexión hecha en estilo Scala idiomático en lugar de recurrir a la API de Java. Solo ideas ... –

+0

No estaba pensando en algunas de las características de metaprogramación más dinámicas, como agregar métodos en tiempo de ejecución o en declaraciones de estilo eval, simplemente en línea con lo que la API de reflexión de Java le permite hacer, pero adaptada para el lenguaje Scala. –

Respuesta

6

El "reemplazo inmutable para el patrón de estilo JavaBean" se puede expresar parámetros con nombre y opcionalmente la anotación @BeanProperty:

import reflect._ 
case class A(@BeanProperty val x: String, @BeanProperty val y : Int) 

A(x = "s", y = 3) 
A(y = 3, x = "s") 

métodos de adición (más precisa: la definición de una nueva interfaz) sólo tiene sentido en un estáticamente mecanografiado si el cliente conoce los nuevos métodos y puede compilar contra la interfaz. Con tipado estructural los clientes pueden definir los métodos que esperan estar presentes en un objeto. El compilador de Scala transformará el tipo de estructura en código de reflexión que puede fallar en el tiempo de ejecución.

type T = {def go(x : Int): Int } 
def y(any : Any) = any.asInstanceOf[T].go(2) 

class A{ 
    def go(x : Int) = x + 1 
} 
y(new A()) 
y(new {}) //this will fail 

Se pueden definir nuevas clases o rasgos con el interpreter sobre la marcha. El método Interpret transforma el código de Scala en código de bytes.

Ya ha mencionado el ScalaSigParser con el que no es exactamente fácil trabajar.

Creo que el resto de funciones que te gustan todavía no están disponibles.

+0

Esto falla en el tiempo de ejecución debido a la fundición, no a causa de los tipos estructurales. –

Cuestiones relacionadas