类型提示可以在多次反射发生的执行时间上有很大的改进。我对类型提示的理解是它只允许编译器缓存反射查找。缓存可以动态发生吗?或者有什么理由这是不好/不可能的?
答案 0 :(得分:6)
这些警告表明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 292,invokedynamic
指令,它允许正确构建具有更好性能的呼叫站点缓存
比起memoizaton。“