6

有没有像 PHP 那样在 Java 中使用魔术方法的方法__call

例如:

 class foo {
     @Setter @Getter
     int id;

     @Getter
     Map <String, ClassInFoo> myMap;

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

     @Setter
     String defaultKey;
 }

我正在为 getter 和 setter 方法使用Project Lombok注释来简化代码。

让我们考虑一下,我的地图包含几个由 String 映射的项目,而 defaultKey 定义了默认项目。

我想要的是能够调用foo.getName()它将默认名称返回为foo.myMap.get(defaultKey).getName().

我不能手动编写所有 getter 的原因是 Foo 类实际上是用泛型继承的,内部类可能不同。

我有点需要类似的东西:

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

这在Java中可能吗?

编辑:

我在这里做了一个更精确的例子来说明我想要实现的目标:https ://gist.github.com/1864457

这样做的唯一原因是“速记”内部类中的方法。

4

2 回答 2

8

您绝对可以通过使用它的功能来通过反射,例如

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

可以用来查看一个类是否定义了一些方法,但我看不出如何通过正确使用接口、继承和方法覆盖来解决您的问题

提供诸如反射之类的功能来管理某些否则无法解决的问题,但 Java 不是 PHP,因此您应该尽可能避免使用它,因为它不在语言的哲学中。

于 2012-02-19T14:55:23.090 回答
3

这不是继承和覆盖的全部意义吗?

基类:

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

子类:

@Overrides
public Object foo() {
    return whateverIWant;
}
于 2012-02-19T14:51:11.783 回答