2012-10-30 15 views
6

我有一個java類,有2個方法具有相同但不同的元素(一個不帶參數,另一個帶1個參數)。我創建了一個覆蓋這兩種方法的代理。問題是,如果從這個Java類中調用no-arg方法 - 調用base實現而不是proxie的方法。但是如果我直接在obj上調用no-arg方法 - 調用正確的代理方法。有人可以解釋這種行爲嗎?在clojure中覆蓋代理中的多元方法

Test.java:

package example; 

public abstract class Test { 

    public void callMethods(Object obj){ 
     callMethods(); 
     callMethods2(); 
    } 

    public void callMethods() { 
     System.out.println("Default callMethods"); 
    } 

    public void callMethods2() { 
     System.out.println("Default callMethods2"); 
    } 

} 

run.clj:

(let [obj (proxy [example.Test] [] 
      (callMethods 
       ([] (println "Overridden callMethods")) 
       ([obj] (proxy-super callMethods obj))) 
      (callMethods2 
       ([] (println "Overridden callMethods2"))))] 
    (.callMethods obj) 
    (.callMethods obj :test)) 

輸出:

Overridden callMethods 
Default callMethods 
Overridden callMethods2 

預期輸出:

Overridden callMethods 
Overridden callMethods 
Overridden callMethods2 

回答

5

代理維護其爲此對象代理的方法的映射。這張地圖中的任何調用都是通過它的方法來處理的,其他人則調用該對象。 proxy-super通過從函數方法圖中刪除自身,調用自己並將自己放回後面來實現它。在調用過程中,對代理對象的該方法的任何調用都將通過代理對象。

  • 輸出的第一行來自於代理的電話,你會看到被覆蓋的輸出
  • 第二行來自超類的方法具有零點的參數,因爲當調用發生壓倒一切的方法不中的對象代理方法圖。
  • 第三行獲取代理,因爲該方法位於對象代理方法映射中。

end of this post by Meikel Brandmeyer中描述了非常類似的情況。我懷疑答案是使用發電類代替代理