在更新 CLJ-713 的 ASM 库提交后,Clojure 的构建通过了所有测试,但其中一个 reflect.clj 中的 compare-reflect-and-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 反射器是默认的。