2009-09-28 69 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”