在将更新后的ASM库提交给CLJ-713之后,Clojure构建通过了所有测试,除了在reflect.clj中比较反射和asm的测试。
这可以缩小到以下两种形式在最新的Clojure和JDK8行为上的差异
`
;;以下两行在最新(2014年1月11日)的Clojure 1.6.0-master-SNAPSHOT中运行正常
;;但如果在JDK 6或JDK 7上运行,则会在JDK 8上抛出异常。
(import '[clojure.asm ClassReader ClassVisitor Type Opcodes])
(def r (ClassReader. "java.lang.Object"))
`
不确定,但通过一些Google搜索,这似乎可能是ASM库版本4的限制 - 当尝试读取由JDK 8生成的类文件时会抛出异常,因为类文件版本号更新了。支持这一结论的链接
http://mail-archive.ow2.org/asm/2013-02/msg00000.html
http://forge.ow2.org/tracker/index.php?func=detail&aid=316375&group_id=23&atid=350023
有几个替代方案
(1) 再次更新ASM,以支持JDK 8类文件
(2) 禁用compare-reflect-and-asm测试。Clojure本身除了解耦测试外,不使用AsmReflector进行任何操作。Java反射器是默认的。