Pregunta

¿Hay alguna forma de usar métodos mágicos en Java como hay en PHP con __call?

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 Proyecto Lombok Anotaciones para los métodos de Getter y Setter para simplificar el código.

Consideremos que mi mapa contiene varios elementos mapeados por cadena y el valor predeterminado define el predeterminado.

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

La razón por la que no puedo escribir todos los Getters manualmente es que la clase FOO se hereda de hecho con genéricos y la clase interna podría ser diferente.

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?

EDITAR:

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 "abreviatura" los métodos en la clase interna.

¿Fue útil?

Solución

Absolutamente puedes a través de reflexión utilizando sus características como

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

Eso se puede usar para ver si una clase tiene algunos métodos definidos, pero no veo cómo su problema no se puede resolver con un uso adecuado de las interfaces, la herencia y la anulación de los métodos

Se proporcionan características como la reflexión para administrar ciertos problemas, de lo contrario, pero Java no es PHP, por lo que debe intentar evitar usarlo cuando sea posible, ya que no está en el filosofía del idioma.

Otros consejos

¿No es el objetivo de herencia y anulación?

Clase base:

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

Subclase:

@Overrides
public Object foo() {
    return whateverIWant;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top