在Java中神奇地调用方法

时间:2012-02-19 14:45:35

标签: java lombok dynamic-dispatch

在PHP中使用魔术方法是否有某些方法,例如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注释来获取getter和setter方法来简化代码。

让我们考虑我的地图包含由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

这样做的唯一原因是&#34;简写&#34;内部类中的方法。

2 个答案:

答案 0 :(得分:6)

您绝对可以通过reflection使用其功能,如

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

可用于查看某个类是否定义了某些方法,但我没有看到如何通过正确使用接口,继承和覆盖方法来解决您的问题

提供反射等功能来管理某些无法解决的问题,但Java不是PHP,所以你应尽量避免使用它,因为它不在语言的哲学中。 / p>

答案 1 :(得分:2)

这不是继承和压倒的全部意义吗?

基类:

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

子类:

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