可以记住Clojure中的Java反射吗?

时间:2009-09-28 03:49:59

标签: clojure

类型提示可以在多次反射发生的执行时间上有很大的改进。我对类型提示的理解是它只允许编译器缓存反射查找。缓存可以动态发生吗?或者有什么理由这是不好/不可能的?

2 个答案:

答案 0 :(得分: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而失败。

总而言之,反射演员不仅仅是缓存而已被淘汰。

答案 1 :(得分:3)

Rich非常友好地启发我: “正确的JDK的真正答案是JSR 292invokedynamic指令,它允许正确构建具有更好性能的呼叫站点缓存 比起memoizaton。“