Soy nuevo en Java; A través de mis estudios, leí que la reflexión se usa para invocar clases y métodos, y para saber qué métodos se implementan o no.
¿Cuándo debo usar la reflexión, y cuál es la diferencia entre usar la reflexión y crear instancias de objetos y llamar a los métodos de la manera tradicional?
java
reflection
Hamzah khammash
fuente
fuente
Respuestas:
La reflexión es mucho más lenta que simplemente llamar a los métodos por su nombre, porque tiene que inspeccionar los metadatos en el código de bytes en lugar de solo usar direcciones y constantes precompiladas.
La reflexión también es más poderoso: puede recuperar la definición de una
protected
ofinal
miembro, quitar la protección y manipularlo como si hubiera sido declarado mutable! Obviamente, esto subvierte muchas de las garantías que el lenguaje normalmente hace para sus programas y puede ser muy, muy peligroso.Y esto prácticamente explica cuándo usarlo. Por lo general, no lo hagas. Si desea llamar a un método, simplemente llámelo. Si desea mutar un miembro, simplemente declare mutable en lugar de ir detrás de la compilación.
Un uso útil de la reflexión en el mundo real es cuando se escribe un marco que tiene que interoperar con clases definidas por el usuario, donde el autor del marco no sabe cuáles serán los miembros (o incluso las clases). La reflexión les permite tratar con cualquier clase sin saberlo de antemano. Por ejemplo, no creo que sea posible escribir una biblioteca compleja orientada a aspectos sin reflexión.
Como otro ejemplo, JUnit solía usar un poco de reflexión trivial: enumera todos los métodos en su clase, supone que todos los llamados
testXXX
son métodos de prueba y ejecuta solo esos. Pero esto ahora se puede hacer mejor con anotaciones, y de hecho JUnit 4 se ha movido en gran medida a las anotaciones.fuente
Una vez fui como tú, no sabía mucho sobre la reflexión, todavía no lo sé, pero lo usé una vez.
Tuve una clase con dos clases internas, y cada clase tenía muchos métodos.
Necesitaba invocar todos los métodos en la clase interna, e invocarlos manualmente habría sido demasiado trabajo.
Utilizando la reflexión, podría invocar todos estos métodos en solo 2-3 líneas de código, en lugar del número de los métodos en sí.
fuente
Agruparía los usos de la reflexión en tres grupos:
fuente
Reflection permite que un programa funcione con código que puede no estar presente y que lo haga de manera confiable.
El "código normal" tiene fragmentos como los
URLConnection c = null
que por su simple presencia hacen que el cargador de clases cargue la clase URLConnection como parte de la carga de esta clase, lanzando una excepción ClassNotFound y saliendo.Reflection le permite cargar clases basadas en sus nombres en forma de cadena y probarlas para varias propiedades (útiles para múltiples versiones fuera de su control) antes de iniciar clases reales que dependen de ellas. Un ejemplo típico es el código específico de OS X utilizado para hacer que los programas Java parezcan nativos en OS X, que no están presentes en otras plataformas.
fuente
Fundamentalmente, la reflexión significa usar el código de su programa como datos.
Por lo tanto, usar la reflexión puede ser una buena idea cuando el código de su programa es una fuente útil de datos. (Pero hay compensaciones, por lo que no siempre es una buena idea).
Por ejemplo, considere una clase simple:
y quieres generar XML a partir de él. Podría escribir código para generar el XML:
Pero esto es mucho código repetitivo, y cada vez que cambia la clase, debe actualizar el código. Realmente, podría describir lo que hace este código como
Este es un algoritmo, y la entrada del algoritmo es la clase: necesitamos su nombre y los nombres, tipos y valores de sus propiedades. Aquí es donde entra en juego la reflexión: le da acceso a esta información. Java le permite inspeccionar tipos utilizando los métodos de la
Class
clase.Algunos casos de uso más:
Sin embargo, la reflexión completa significa no solo mirar el código existente (que en sí mismo se conoce como "introspección"), sino también modificar o generar código. Hay dos casos de uso prominentes en Java para esto: proxies y simulacros.
Digamos que tienes una interfaz:
y tienes una implementación que hace algo interesante:
Y, de hecho, también tiene una segunda implementación:
Ahora también desea una salida de registro; simplemente desea un mensaje de registro cada vez que se llama a un método. Podría agregar la salida de registro a cada método explícitamente, pero eso sería molesto, y tendría que hacerlo dos veces; una vez para cada implementación. (Entonces aún más cuando agrega más implementaciones).
En cambio, puede escribir un proxy:
De nuevo, sin embargo, hay un patrón repetitivo que puede ser descrito por un algoritmo:
y la entrada de este algoritmo es la definición de la interfaz.
Reflection le permite definir una nueva clase usando este algoritmo. Java le permite hacer esto usando los métodos de la
java.lang.reflect.Proxy
clase, y hay bibliotecas que le dan aún más poder.¿Cuáles son las desventajas de la reflexión?
fuente
Reflection puede mantener automáticamente sincronizadas partes de su programa, donde anteriormente, habría tenido que actualizar manualmente su programa para usar las nuevas interfaces.
fuente