2012-01-15 20 views
11

Estoy trabajando en mi primer proyecto real con Java. Estoy empezando a sentirme cómodo con el idioma, aunque tengo más experiencia con los lenguajes dinámicos.Programación de metadatos Java

tengo una clase que se comporta similar a la siguiente:

class Single 
{ 
    public void doActionA() {} 
    public void doActionB() {} 
    public void doActionC() {} 
} 

Y luego tengo una clase SingleList que actúa como una colección de estas clases (en concreto, es para una biblioteca 2D Sprite, y el " las acciones "son todo tipo de transformaciones: rotar, cizallar, escalar, etc.). Quiero ser capaz de hacer lo siguiente:

class SingleList 
{ 
    public void doActionA() { 
     for (Single s : _innerList) { 
      s.doActionA(); 
     } 
    } 

    ... etc ... 
} 

¿Hay alguna manera de adherirse simplemente un método (o una lista conocida de métodos) para cada miembro de la lista de interior? De cualquier forma sin tener que enumerar específicamente cada método, recorra cada miembro interno y aplíquelo manualmente.

Para hacer las cosas un poco más difíciles, los métodos son de variación de tamaño, pero son todos de tipo de retorno "vacío".

+0

Creo que se puede echar un vistazo a la reflexión de Java, lo que le permite llamar a métodos en tiempo de ejecución. – Alvin

+0

Pero aún necesitaría generar todos los stubs de método en la clase SingleList. Estoy buscando más una solución que actúe como un método invocado por todos. Al igual que llamar en PHP o python getattr. – efritz

+0

oh no necesita actualizar, con la reflexión puede hacer SingleList.get ("someAttr"), luego la reflexión llamará al método getSomeAttr() por usted. Puede buscar en Google "org.springframework.beans.BeanUtils", que hace lo que quiere. Escribiré un ejemplo como respuesta formal más tarde si nadie me pega a eso jaja. – Alvin

Respuesta

11

Desafortunadamente, Java no admite la creación de clases en tiempo de ejecución, que es lo que necesita: el SingleList debe actualizarse automáticamente con los métodos stub necesarios para que coincidan con la clase Single.

puedo pensar en las siguientes aproximaciones a este tema:

  1. Uso Java reflection:

    • Pros:
      • Es fácilmente disponible en el lenguaje Java y se puede encontrar fácilmente documentación y ejemplos.
    • Contras:
      • La clase SingleList no sería compatible con la interfaz Single clase más.
      • El compilador de Java y cualquier IDE son generalmente incapaces de ayudar con los métodos llamados a través de la reflexión - los errores que serían capturados por el compilador normalmente se transforman en excepciones de tiempo de ejecución.
      • Dependiendo de su caso de uso, también puede observar una notable degradación del rendimiento.
  2. uso de un sistema de construcción junto con algún tipo de generador de código fuente para crear automáticamente el archivo SingleList.java.

    • Pros:
      • Una vez que lo configura usted no tendrá que tratar con él nunca más.
    • Contras:
      • configurar esto tiene un grado de dificultad.
      • Debería asegurarse por separado de que la clase SingleList cargada en cualquier JVM, o su IDE, en realidad, coincida con la clase Single cargada.
  3. abordar esta cuestión de forma manual - la creación de una interfaz (por ejemplo SingleInterface) o una clase abstracta de base para el uso de ambas clases debería ayudar, ya que cualquier IDE decente señalará métodos no implementados. La arquitectura de clase adecuada minimizaría el código duplicado y su IDE podría ayudar a generar las partes repetidas.

    • Pros:
      • No hay ninguna curva de configuración de superar.
      • Su IDE siempre verá el conjunto de clases correcto.
      • La arquitectura de clase generalmente se mejora después.
    • Contras:
      • Todo es manual.
  4. utilizar una biblioteca de generación de código de bytes tal como Javassist o BCEL para generar dinámicamente/modificar la clase SingleList sobre la marcha.

    • Pros:
      • Este método es muy potente y puede ahorrar mucho tiempo en el largo plazo.
    • Contras:
      • Uso de bibliotecas de generación de código de bytes es típicamente no trivial y no para los débiles de corazón.
      • Dependiendo de cómo escriba su código, también puede tener problemas con su IDE y su manejo de las clases dinámicas.
+0

Parece que el enfoque manual es el camino a seguir. Solo tendré que asegurarme de mantener la interfaz actualizada si agrego más transformaciones. – efritz