2012-02-19 19 views
6

在Java中使用神奇方法有什麼方法,比如在PHP中使用__call在Java中以神奇的方式調用方法

例如:

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

這樣做的唯一原因是「速記」中的內部類的方法。

+0

Upvoting作爲一個有趣的問題,但這不應該被標記爲OOP。您感興趣的功能不是面向對象的,事實上也不一定是動態的。 – Perception 2012-02-19 15:18:00

+1

一般而言,您需要自己的getter和setter,您可以使用IDE生成它們。例如,讓getter返回一個可變集合不是一個好主意。相反,你可以有'ClassInFoo getMyMap(String name)' – 2012-02-19 16:27:50

+0

好吧,我可以寫所有的getters,但我發現它重複和醜陋。我只是想這樣,以便我的HTML編碼人員可以簡單地請求這些方法。 – 2012-02-19 22:30:05

回答

5

你絕對可以通過reflection通過使用像

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

,可以用來查看是否有類有其功能定義了一些方法,但我沒有看到如何正確使用o不能解決您的問題提供F接口的,繼承和方法

特點一樣的反射壓倒一切的管理肯定的,否則無法解決的,問題,但Java不是PHP所以你應該儘量避免可能的時候使用它,因爲它不是在的理念語言。

+0

反思幫助我解決了這個問題。謝謝! – 2012-02-22 22:58:11

2

難道不是繼承和重寫的全部觀點嗎?

基類:

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

子類:

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

我在這裏提供了一個更精確的示例:https://gist.github.com/1864457 - 您能否詳細解釋您的建議?謝謝。 – 2012-02-19 16:11:24

+0

如果Fruit類中的getName()方法像這樣實現,它將按預期工作:return getContents()。get(getDefaultKey())。getName()'。你是否理解繼承和壓倒一切的工作?閱讀http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html – 2012-02-19 16:16:52