Волшебный вызов методов в Java - PullRequest
6 голосов
/ 19 февраля 2012

Есть ли способ использовать магические методы в Java, как в PHP с __call?

Например:

 class foo {
     @Setter @Getter
     int id;

     @Getter
     Map <String, ClassInFoo> myMap;

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

     @Setter
     String defaultKey;
 }

Я использую Project Lombok аннотации для методов получения и установки для упрощения кода.

Давайте рассмотрим, что моя карта содержит несколько элементов, отображаемых с помощью String, и defaultKey определяет элемент по умолчанию.

Что бы я хотелчтобы иметь возможность вызывать foo.getName(), который возвращает имя по умолчанию как foo.myMap.get(defaultKey).getName().

Причина, по которой я не могу просто написать все методы получения вручную, заключается в том, что класс Foo на самом деле наследуется с обобщениями ивнутренний класс может быть другим.

Мне нужно что-то вроде:

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

Возможно ли это как-то на Java?

РЕДАКТИРОВАТЬ:

IЯ сделал более точный пример того, чего я пытаюсь достичь: https://gist.github.com/1864457

Единственная причина, по которой это делается, - это "сокращение" методов во внутреннем классе.

Ответы [ 2 ]

6 голосов
/ 19 февраля 2012

Вы можете пройти через отражение , используя его функции, такие как

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

, которые можно использовать, чтобы увидеть, есть ли в классе определенные методы, но я не понимаю, какова ваша проблемане может быть решена с помощью правильного использования интерфейсов, наследования и переопределения методов

Предоставляются такие функции, как рефлексия, для управления определенными, в противном случае неразрешимыми проблемами, но Java не является PHP, поэтому вам следует избегать его использования, когдавозможно, так как это не в философии языка.

2 голосов
/ 19 февраля 2012

Разве это не весь смысл наследования и переопределения?

Базовый класс:

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

Подкласс:

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