2010-07-24 17 views

Respuesta

3

En mi opinión ...

adecuada (limpia):

  • Instanciando raíz de una aplicación de carga dinámica, como un applet.
  • El uso de Proxy para crear un proxy o un simulacro de aplicación (puede ser mejor en tiempo de compilación).
  • Implementación de intérpretes que permiten el acceso irrestricto a las bibliotecas de Java. (Tenga en cuenta, desde una perspectiva de seguridad del código interpretado ahora tiene los privilegios eficaces como el intérprete - puede ser un poco peligroso.)

cortes apropiados:

  • controles de acceso al idioma eludir Java en código de terceros donde es absolutamente necesario.
  • Implementando una "preocupación transversal" como la persistencia.
  • Eliminando las dependencias estáticas que cargan las clases y causan un arranque más lento.

inapropiado:

  • eludir los controles de acceso lenguaje Java generales (incluye pruebas).
  • Cualquier cosa que el se basa en Java derechos de acceso lenguaje determinado por la clase de reflexión-llamando particular.
  • En cualquier lugar donde la implementación de una interfaz funcionaría.

En general, la reflexión es mucho más fácil que generar una fuente que es mucho más fácil que crear bytecode.

+0

Me gusta el comentario sobre las interfaces; Me encontré con un código que mantenía recientemente donde creo que era el caso. – Feanor

2

Sugeriría echar un vistazo al libro: Java Reflection in Action.

Es muy buena, es detallada, y prácticamente una referencia completa acerca de este concepto avanzado.

También es mucho más de lo que puedas explicar aquí, con escenarios, usos y conceptos que primero vienen clara cuando simplemente lo lee :).

1

Al igual que con cualquier tecnología, el SENCE común debe ser el conductor para determinar qué uso es apropiado. No "patrones", bloqueando la capacidad de pensamiento del cerebro.

No piense en la reflexión como de la "tecnología". Es solo un objeto de metadatos asociado con cualquier tipo de datos y disponible en tiempo de ejecución. Objeto simple, implementado de la mejor manera posible (solo piense cómo lo implementaría y probablemente adivine la implementación real).

Por simples consideraciones, está claro que todos los métodos en Clase/Método/Campo de tipo get-something-name provocan una búsqueda de mapa/índice cada vez que se invocan, por lo que esta operación es algo que vale la pena una vez en la vida de la aplicación. Pero una vez que se obtiene, el rendimiento de method.invoke (object, args) es prácticamente el mismo que el de object.method (args), ya que solo introduce un nivel más de direccionamiento indirecto, sin incluir búsquedas adicionales.

ejemplos en los que yo usaría enfoque basado en la reflexión: propiedades

  • initialize/copiar/serializar/impresión de frijol por su nombre, esta tarea se presenta en la mayoría de las aplicaciones de negocio y, una vez que se utiliza una programación dinámica (es decir, hacer búsquedas basadas en nombres solo una vez para inicializar convertidores/cargadores y luego aplicar el mismo convertidor a lo largo de la vida útil de la aplicación) agrega no demasiada sobrecarga, pero agrega una flexibilidad excelente al software (ver commons-beanutils, inyección de dependencia de primavera).

  • de transacción/sesión/autorización/métricas/proxies simuladas (utilizando la API de proxy dinámico de JDK)

  • alternativa conveniente a XSD eliminando analizador XML (utilizando JPA/JAXB/WS/JAXB y cualesquiera otras anotaciones) para mantener información complementaria acerca de cómo el objeto se persista en sí, lo que las etiquetas de interfaz gráfica de usuario se visualiza para cada campo, etc (ver JAX-WS, hibernación)

no puedo pensar en un ejemplo en el que llenar no utilizo Reflexión, simplemente no lo use cuando la solución basada en metadatos no sea óptima (simplemente analice qué objeto de metadatos es).

0

Lo usé para sincronizar bits simples de código no modificado para una asignación de CS. Hubo tres programas de búsqueda de números primos para los cuales debíamos comparar el tiempo de ejecución para 10 techos espaciados uniformemente desde 1E5-1E6. Debido a que todos tomaron la entrada de la misma manera (techo \ n desde stdin) podría usar la redirección de stdio para alimentarlos con la entrada de "teclado" para el techo y eliminar la salida y comparar los tiempos de ejecución limpiamente. Por supuesto, esto solo fue posible (sin modificar el código) mediante el uso de la reflexión para invocar los métodos principales. Los programas de prueba no modificados no eran un requisito, pero pensé que sería divertido. Entonces encontré este hilo buscando r

Cuestiones relacionadas