Pregunta

Recientemente estaba hablando con un compañero de trabajo acerca de C++ y se lamentaba de que no había manera de que tome una cadena con el nombre de un campo de clase y extraer el campo con ese nombre;en otras palabras, carece de reflexión.Él me dio un desconcertado mirada y preguntó si alguien alguna vez tendría que hacer tal cosa.

La parte superior de mi cabeza yo no tenía una buena respuesta para él, aparte de "hey, tengo que hacerlo ahora".Así que me senté y vino para arriba con una lista de algunas de las cosas que he hecho con la reflexión en varios idiomas.Desafortunadamente, la mayoría de mis ejemplos vienen de mi web, programación en Python, y tenía la esperanza de que la gente de aquí habría más ejemplos.Aquí está la lista que se me ocurrió:

  1. Dado un archivo de configuración con líneas como
    x = "Hola Mundo!"
    y = 5.0
    establecer dinámicamente los campos de algunos config objeto igual a los valores en el archivo.(Esto era lo que yo deseaba que yo podía hacer en C++, pero en realidad no podía hacer.)

  2. A la hora de ordenar una lista de objetos, un orden basado en un atributo arbitrario dado que el nombre del atributo de un archivo de configuración o solicitud web.

  3. Cuando la escritura de software que utiliza un protocolo de red, la reflexión le permite llamar a métodos basados en la cadena de valores de ese protocolo.Por ejemplo, escribí un bot de IRC que se traduciría
    !some_command arg1 arg2
    en una llamada al método actions.some_command(arg1, arg2) y imprimir lo que la función devuelve de nuevo a la canal de IRC.

  4. Cuando se utiliza Python __getattr__ (función, que es algo así como method_missing en Ruby/Smalltalk) yo estaba trabajando con una clase con un montón de estadísticas, tales como late_total.Para cada estadística, quería ser capaz de añadir _percent para conseguir que la estadística como un porcentaje del total de las cosas que me estaba contando (por ejemplo, estadísticas.late_total_percent).La reflexión esta muy fácil.

Así que alguien aquí puede dar cualquiera de los ejemplos de sus propias experiencias de programación de los tiempos, cuando la reflexión ha sido útil?La próxima vez que un compañero de trabajo me pregunta por qué me "alguna vez quieres hacer algo como que" me gustaría estar más preparado.

¿Fue útil?

Solución

Me puede la lista siguiente de uso para la reflexión:

  • El enlace
  • De seguridad (introspección código por razones de seguridad)
  • Código de análisis
  • Tipado dinámico (pato escritura no es posible sin reflexión)
  • Metaprogramación

Algunos en el mundo real de los usos de la reflexión desde mi experiencia personal:

  • Desarrollado sistema de plugins basados en la reflexión
  • Utiliza la programación orientada a aspectos del modelo
  • Realiza análisis de código estático
  • Utiliza diversos frameworks de Inyección de dependencias
  • ...

La reflexión es lo bueno :)

Otros consejos

He utilizado la reflexión para obtener la información del método de excepciones, registro, etc.

string src = MethodInfo.GetCurrentMethod().ToString();
string msg = "Big Mistake";
Exception newEx = new Exception(msg, ex);
newEx.Source = src;

en lugar de

string src = "MyMethod";
string msg = "Big MistakeA";
Exception newEx = new Exception(msg, ex);
newEx.Source = src;

Es simplemente más fácil para copiar/pegar de la herencia y la generación de código.

Estoy en una situación en la cual tengo un flujo de XML que viene en sobre el alambre y necesito crear una instancia de un objeto de Entidad, que reúne en sí a partir de los elementos en la secuencia.Es más fácil utilizar la reflexión para averiguar cuál es la Entidad objeto puede manejar elemento XML que escribir un gigantesco de mantenimiento, para pesadilla de la instrucción condicional.Existe una clara dependencia entre el esquema XML y cómo me la estructura y el nombre de mis objetos, pero tengo el control de ambos, por lo que no es un gran problema.

Hay mucho de la de veces que desee para crear dinámicamente una instancia y trabajar con objetos en los que el tipo no se conoce hasta el tiempo de ejecución.Por ejemplo, con los O-miembros de la comunidad o en una arquitectura de plugin.Burlándose de los marcos de utilizar, si se desea escribir un registro y de la biblioteca de forma dinámica desea examinar el tipo y las propiedades de las excepciones.

Si pienso un poco más, es probable que pueda llegar con más ejemplos.

Me parece reflexión muy útil si la entrada de datos (como xml) tiene una estructura compleja que se correlacionan fácilmente objeto de instancias o necesito algún tipo de "es una" relación entre las instancias.

Como reflexión es relativamente sencilla en java, yo a veces lo uso para datos simples (clave-valor mapas), donde tengo un pequeño conjunto fijo de teclas.Por un lado es sencillo determinar si una clave es válida (si la clase tiene un setter setKey(String data)), por otro lado, me puede cambiar el tipo de la (textual) de entrada de datos y ocultar la transformación (e.g simple fundido a int en getKey()), por lo que el resto de la aplicación se puede confiar en escribir correctamente los datos.Si el tipo de clave-valor par de los cambios de un objeto (por ejemplo,formulario de int a float), sólo tengo que cambiar en los datos de objeto y de sus usuarios, pero no tienen que tener en cuenta para comprobar el analizador demasiado.Esto podría no ser un enfoque sensato, si el rendimiento es un problema...

La escritura de los repartidores.Trenzado utiliza python reflexivo de capacidades para el envío de XML-RPC y SOAP llamadas.RMI utiliza Java reflexión de la api para el envío.

Línea de comandos de análisis.La construcción de un objeto de configuración basado en los parámetros de línea de comandos que se pasan.

Cuando la escritura de la unidad de pruebas, puede ser útil el uso de la reflexión, a pesar de todo lo he utilizado para la derivación de los modificadores de acceso (Java).

He utilizado la reflexión en C# cuando había alguna interno o método privado en el marco o una biblioteca de terceros que quería acceder.

(Descargo de responsabilidad:No es necesariamente una mejor práctica debido privado y los métodos internos puede ser cambiado en las versiones posteriores.Pero funcionó para lo que yo necesitaba.)

Así, en estáticamente tipado idiomas, te gustaría utilizar la reflexión en cualquier momento que usted necesita para hacer algo "dinámico".Viene en práctico de herramientas de efectos (escaneo de los miembros de un objeto).En Java se utiliza en JMX y proxies dinámicos bastante.Y hay un montón de casos donde es realmente la única manera de ir (prácticamente en cualquier momento que usted necesita para hacer algo que el compilador no le deja hacer).

Yo por lo general uso de la reflexión para la depuración.La reflexión puede más fácilmente y con mayor precisión de visualización de los objetos dentro del sistema de una variedad de instrucciones de impresión.En muchos idiomas que han de primera clase de funciones, incluso se puede invocar las funciones del objeto sin necesidad de escribir código especial.

Hay, sin embargo, una manera de hacer lo que quiera(ed).El uso de una tabla hash.La tienda de los campos llave contra el campo nombre.

Si usted realmente desea, puede entonces crear estándar Get/Set de funciones, o crear macros que hacerlo sobre la marcha. #define GetX() Get("X") tipo de cosas.

Incluso se podría implementar su propio reflejo imperfecto de esa manera.

Para el usuario avanzado, si se puede compilar el código, puede ser posible para permitir la salida de depuración de la generación y el uso que para llevar a cabo la reflexión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top