13

Algunos lenguajes como Dart usan reflejos basados ​​en reflejos, por lo tanto, en términos simples, cuál es la diferencia entre tal implementación y la reflexión tradicional como se ve en C# o Java.¿Cuál es la diferencia entre la reflexión basada en espejo y la reflexión tradicional?

Actualización: Encontré este video excelente (y algo extravagante) de Gilad Bracha sobre la reflexión basada en Mirror en Newspeak. http://www.hpi.uni-potsdam.de/hirschfeld/events/past/media/100105_Bracha_2010_LinguisticReflectionViaMirrors_HPI.mp4 (las cosas de espejo comienzan a las 7:42)

Respuesta

21

Para muchos usos, no creo espejos serán tan diferente a la reflexión de Java . Lo más importante acerca de los espejos es que desacoplan la API de reflexión de la API de objeto estándar, por lo que en lugar de obj.getClass() se usa reflect (obj). Es una pequeña diferencia en apariencia, pero le da un par de cosas agradables:

  1. El objeto API no está contaminada, y no hay peligro de romper la reflexión reemplazando un método reflexivo.
  2. Es posible que tenga diferentes sistemas de espejo. Digamos, uno que no permite el acceso a métodos privados. Esto podría terminar siendo muy útil para las herramientas.
  3. El sistema de espejo no tiene que ser incluido. Para compilar en JS esto puede ser importante. Si no se utilizan espejos, no hay código fuera de banda para acceder y la poda se vuelve viable.
  4. Los espejos se pueden hacer para que funcionen en código remoto, no solo en código local, ya que no necesita que el objeto reflejado esté en el mismo Aislante o VM que el espejo.

Así es como espejos son diferentes a la reflexión en Java y Javascript cuando se utiliza para obtener métodos de un objeto:

Java:

myObject.getClass().getMethods(); // returns an array 

dardo:

reflect(myObject).type.methods; // returns a map 

Javascript:

var methods = []; 
for (var m in myObject) { 
    if (typeof m === 'function') { 
    methods.push(m); 
    } 
} 
5

Su mejor opción es this article by Gilad Bracha, co-diseñador de Dart y autor de las especificaciones. Para echar un vistazo, probablemente será suficiente leer el primer capítulo.

Las afirmaciones abstractas que los espejos se adhieren a tres principios necesarios que no son seguidos por la reflexión tradicional:

identificamos tres principios de diseño para la reflexión y metaprogramming instalaciones en los lenguajes de programación orientados a objetos. Encapsulación: las instalaciones de meta-nivel deben encapsular su implementación. Estratificación: las instalaciones de meta-nivel deben separarse de funcionalidad de nivel base. Correspondencia ontológica: la ontología de las instalaciones de meta-nivel debe corresponder a la ontología del lenguaje que manipulan. Tradicional/convencional reflexivo arquitecturas no siguen estos preceptos. Por el contrario, reflexivas API construidas alrededor del concepto de espejos se caracterizan por el cumplimiento de los tres principios de .

+0

¿puedes resumir? –

1

También me gustaría señalar a esta otra respuesta reciente de Gilad, donde se enumeran algunos otros grandes material de referencia: How to get concrete object of a static method via mirror API?

+1

Gracias John. Vi esos enlaces antes. Tenía la esperanza de obtener rápidamente un resumen o una esencia en lugar de leer el periódico. –

+0

Muchas de las diferencias, en mi opinión, están en el nivel de ingeniería de software, y no tan interesantes para aquellos de nosotros que escribimos software encima de ellas. Usar espejos me resulta más fácil que mi experiencia con la API .net reflection. –

Cuestiones relacionadas