2009-09-28 67 views
4

類型提示可以大大改善反射發生多次的執行時間。我對類型提示的理解是,它只允許編譯器緩存反射查找。該緩存是否可以動態地發生?或者是否有某些原因會導致這種情況不好/不可能?Clojure中的Java反射可以被記憶嗎?

回答

6

Programming Clojure

這些警告表明,Clojure的有沒有辦法知道 C的類型。你可以提供一個類型提示解決此問題,使用元數據的語法 ^Class

(defn describe-class [#^Class c] 
{:name (.getName c) 
:final (java.lang.reflect.Modifier/isFinal (.getModifiers c))}) 

有了類型提示,反射警告將消失。編譯的Clojure代碼將與編譯的Java代碼完全相同。 此外,嘗試使用除類 以外的其他名稱調用describe-class將失敗並出現ClassCastException。

所以總結一下,反射投射不僅僅是緩存它被消除。

+0

感謝您糾正我對錯誤理解類型提示的工作方式。我仍然覺得關於緩存反射的更大問題沒有得到答覆,但是會接受這一點,即儘可能不要直截了當。 – 2009-09-28 06:57:16

3

豐富還跟賜教: 「對於JDK適當真正的答案是JSR 292,在invokedynamic指令,它允許調用點緩存的正常結構與性能要好得多 比memoizaton」