在提交更新后的ASM库(CLJ-713)之后,Clojure构建并通过了除了reflect.clj中的compare-reflect-and-asm之外的所有测试。
这可以缩小到以下两个形式在使用最新的Clojure和JDK8时的行为差异
`
;; 以下两行在最新的(2014年1月11日)Clojure 1.6.0-master-SNAPSHOT上运行时正常,但如果在JDK 6或JDK 7上运行,则会抛出异常。
(import '[clojure.asm ClassReader ClassVisitor Type Opcodes])
(def r (ClassReader. "java.lang.Object"))
I不确定,但通过一点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反射器是默认的。