문제

Clojure 프록시 Proxy에 전달 된 fns는 기존 메소드를 무시하거나 super.method()와 함께 호출되어 있습니까?

다음 코드에서는 frequencyhandler.get ()이 프록시 get []와 함께 호출됩니다.

;see: http://github.com/paulosuzart/JTornado
(ns org.ctornadoweb)
(import '(org.jtornadoweb Web$RequestHandler))
(import '(org.jtornadoweb HttpServer Web$Application))


(let [myHandler (proxy [Web$RequestHandler] [] 
                  (get [] 
                    (.write "Hi CLJ"))
                  (post []
                    (.write "POST")))]

(.listen
  (HttpServer.  
    (.add (Web$Application.) "/" (class myHandler))
    false nil false) 8089))
.

컴파일 된 / 상속 버전에도 동일한 일이 발생합니다.

; Starts a JTornado HTTP Server and a sample RequestHandler.
; Bit verbose due to compilation directives. Recommendation is to generate 
; a set of macros to hide this.
(ns org.ctornadoweb
; Compiled and implements a static main method to start the server
  (:import (org.jtornadoweb HttpServer)
           (org.jtornadoweb.Web$Application)
           (org.jtornadoweb.Web$RequestHandler))
  (:gen-class :prefix "server-"))

(gen-class
 :name org.ctornadoweb.MyHandler
 :extends org.jtornadoweb.Web$RequestHandler
 :prefix "do")

(defn do-get [this]
  "Handles the HTTP GET method"
  (.write "hello clojure"))
(defn do-post [this]
  "Handles the HTTP POST method"
  (.write (.getArgument "name" "default" false)))


(defn server-main []
  "main method"
 (.listen
  (org.jtornadoweb.HttpServer.
   (.add (org.jtornadoweb.Web$Application.) "/" org.ctornadoweb.MyHandler)
     false nil false) 8089))

;use (compile 'org.ctornadoweb)
.

트레이스는 프록시가 호출되고 super.get을 보여줍니다 (기본적으로 기본적으로)

HTTP 405: Method Not Allowed 
    at org.jtornadoweb.Web$RequestHandler.get(Web.java:72)
    at org.ctornadoweb.proxy$org.jtornadoweb.Web$RequestHandler$0.get(Unknown Source)
.

Clojure 프록시의 실제 행동에 대해 몇 가지 단어를 찾으려고 노력했습니다.누군가이 도움을 줄 수 있습니까?

도움이 되었습니까?

해결책

아니오, 슈퍼 메소드는 자동으로 호출되지 않지만 proxy-super로 명시 적으로 호출 할 수 있습니다.

다음 테스트 케이스는해야 할 일이 일하는 것들을 보여줍니다.

user=> (def foo 
         (proxy [java.util.ArrayList] [] 
           (clear [] (println "not clearing"))))
#'user/foo
user=> (.size foo)
0
user=> (.add foo "hi")
true
user=> (.add foo "bye")
true
user=> (.size foo)
2
user=> (.clear foo)
not clearing
nil
user=> (.size foo)
2
.

super.clear()가 호출되면 크기가 0으로 표시됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top