更新 CLJ-713 的 ASM 库后,Clojure 编译时除了 reflect.clj 中的 compare-reflect-and-asm 测试通过外,所有测试都失败了。
这可以通过在最新的 Clojure 和 JDK8 上评估以下 2 个形式的差异来缩小一些
`
;; 以下两行与最新的 (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 反射器是默认的。