Reflexión (informática)

capacidad de un programa informática para examinar el programa en sí mismo
Esta es una versión antigua de esta página, editada a las 16:53 22 jul 2006 por Pilaf (discusión · contribs.). La dirección URL es un enlace permanente a esta versión, que puede ser diferente de la versión actual.

En informática, reflexión (o reflexión computacional) es la capacidad de una programa de ordenador para observar y opcionalmente modificar su estructura de alto nivel.

Normalmente, la reflexión es dinámica o en tiempo de ejecución, aunque algunos lenguajes de programación soportan reflexión en tiempo de compilación ó estática. Es más común en lenguajes de programación de alto nivel ejecutándose sobre una máquina virtual, como Smalltalk ó Java, y menos común en lenguajes de programación de bajo nivel como C.

En un sentido más amplio, la reflexión es una actividad computacional que razona sobre su propia computación.

Cuando el código fuente de un programa se compila, normalmente se pierde la información sobre la estructura del programa conforme se genera el código de bajo nivel (normalmente lenguaje ensamblador). Si un sistema soporta reflexión, se preserva la estructura como metadatos en el código generado. Dependiendo de la implementación, el código con reflexión tiende a ser más lento que el que no lo tiene.

En los lenguajes que no distiguen entre tiempo de ejecución y tiempo de compilación (como las distintas variantes de Lisp), no hay diferencia entre compilación o interpretación de código y reflexión.

Implementación

Un lenguaje que soporta reflexión proporciona un conjunto de características disponibles en tiempo de ejecución que, de otro modo, serían muy difícilmente realizables en un lenguaje de más bajo nivel. Algunas de estas caractacterísticas son las habilidades para:

  • Descubrir y modificar construcciones de código fuente (tales como bloques de código, clases, métodos, protocolos, etc.) como objetos de "categoría superior" en tiempo de ejecución.
  • Convertir una cadena que corresponde al nombre simbólico de una clase o función en una referencia o invocación a esa clase o función.
  • Evaluar una cadena como se fuera una sentencia de código fuente en tiempo de ejecución.