2012-02-19 25 views
6

¿Hay alguna forma de usar métodos mágicos en Java como los hay en PHP con __call?Mágicamente, llame a los métodos en Java

Por ejemplo:

class foo { 
    @Setter @Getter 
    int id; 

    @Getter 
    Map <String, ClassInFoo> myMap; 

    protected class ClassInFoo { 
      @Setter @Getter 
      String name; 
    } 

    @Setter 
    String defaultKey; 
} 

estoy usando Project Lombok anotaciones para los métodos get y set para simplificar el código.

Consideremos que mi mapa contiene varios elementos mapeados por String y el defaultKey define el predeterminado.

Lo que me gustaría es poder llamar al foo.getName() que devolvería el nombre predeterminado como foo.myMap.get(defaultKey).getName().

La razón por la que no puedo simplemente escribir todos los captadores manualmente es que la clase Foo es de hecho heredada con genéricos y la clase interna puede ser diferente.

en cierto modo me necesito algo como:

function Object __call(method) { 
      if (exist_method(this.method) 
       return this.method(); 
      else 
       return this.myMap.get(defaultKey).method(); 
    } 

¿Es esto de alguna manera posible en Java?

EDIT:

Hice un ejemplo más preciso de lo que estoy tratando de lograr aquí: https://gist.github.com/1864457

La única razón de hacer esto es a "taquigrafía" los métodos de la clase interna.

+0

Upvoting como una pregunta interesante, pero esto no debe etiquetarse como OOP. La característica que le interesa no está orientada a objetos y, de hecho, ni siquiera es necesariamente dinámica. – Perception

+1

Generalmente, usted quiere su propio getter y setters que puede generar con su IDE. Por ejemplo, no es una buena idea hacer que un getter devuelva una colección mutable. en su lugar, puede tener 'ClassInFoo getMyMap (String name)' –

+0

Sí, bueno, puedo escribir todos los captadores, pero lo encontré duplicado y feo. Simplemente me gustaría esto para que mis chicos de codificación HTML puedan solicitar estos métodos simplemente. –

Respuesta

5

Es absolutamente posible a través reflection mediante el uso de sus características como

public Method getMethod(String name, Class<?>... parameterTypes) 

que se puede utilizar para ver si una clase tiene algunos métodos definidos, pero no veo cómo su problema no pudo ser resuelto con un uso adecuado o interfaces de f, la herencia y de la anulación de los métodos

características como la reflexión se proporcionan para gestionar determinados, de otro modo irresolubles, temas, pero Java no es PHP por lo que debe tratar de evitar su uso cuando sea posible, ya que no está en el filosofía de el idioma.

+0

La reflexión me ayudó a resolver el problema. ¡Gracias! –

2

¿No es todo el tema de la herencia y la anulación?

Clase base:

public Object foo() { 
    return this.myMap.get(defaultKey).method(); 
} 

Subclase:

@Overrides 
public Object foo() { 
    return whateverIWant; 
} 
+0

Hice un ejemplo más preciso aquí: https://gist.github.com/1864457 - ¿puede explicar su propuesta con más detalle? Gracias. –

+0

Si el método getName() en la clase Fruit se implementa de esta manera, funcionará como se espera: return 'getContents(). Get (getDefaultKey()). GetName()'. ¿Estás entendiendo cómo funciona la herencia y el trabajo superior? Leer http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html –

Cuestiones relacionadas