只有當Clojure無法根據周圍的上下文推斷出確切的調用方法時,Clojure纔會在運行時進行反射,否則會發出直接調用該方法的代碼。如果需要,可以使用類型提示爲編譯器提供此上下文。例如:
user=> (set! *warn-on-reflection* true)
user=> (defn str-len [x] (.length x))
Reflection warning, NO_SOURCE_PATH:1:19 - reference to field length can't be resolved.
user=> (defn str-len-2 [^String x] (.length x))
user=> (str-len "abc") ; -> 3
user=> (str-len-2 "abc") ; -> 3
user=> (time (dotimes [_ 100000] (str-len "abc")))
"Elapsed time: 1581.163611 msecs"
user=> (time (dotimes [_ 100000] (str-len-2 "abc")))
"Elapsed time: 36.838201 msecs"
第一個函數每次調用時都會使用反射;第二個與本地Java代碼具有相似的性能。
謝謝,這是非常有幫助的。 –