2012-10-30 21 views
6

Mam klasę java, która ma 2 metody z tymi samymi, ale różnymi ariami (jeden nie bierze żadnych argumentów, inny bierze 1 argument). Tworzę serwer proxy, który przesłania obie te metody. Problem polega na tym, że jeśli z tej klasy java wywoływana jest metoda no-arg, to zamiast proxie wywoływana jest podstawowa implementacja. Ale jeśli wywołasz metodę no-arg bezpośrednio na obj - zostanie wywołana właściwa metoda proxy. Czy ktoś może wyjaśnić to zachowanie?Nadpisywanie wielu metod w proxy w 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)) 

wyjściowa:

Overridden callMethods 
Default callMethods 
Overridden callMethods2 

oczekiwany wynik:

Overridden callMethods 
Overridden callMethods 
Overridden callMethods2 

Odpowiedz

5

Serwer proxy przechowuje mapę metod, które są proxy dla tego obiektu. Każde wywołanie na tej mapie obsługuje się tą metodą, inne wywołują obiekt. proxy-super Czy to magia, usuwając się z mapy metod funkcji, nazywając siebie i oddając się powrotem słów. Podczas trwania wywołania wszelkie wywołania tej metody obiektu proxy przechodzą do obiektu proxy.

  • Pierwszy wiersz wyjścia pochodzi z proxy rozmowy i zobaczyć wyjście przesłonięta
  • Druga linia pochodzi od metody super za zero argumentów, bo gdy to wezwanie dzieje metoda nadrzędnym nie jest w obiektach proxy mapa metod.
  • Trzecia linia jest proxowana, ponieważ ta metoda znajduje się w mapach metod proksymowanych obiektów.

Bardzo podobny scenariusz opisano na stronie end of this post by Meikel Brandmeyer. Podejrzewam, że odpowiedzią jest użycie klasy genowej zamiast proxy