2024 Clojure状态调查! 中分享您的观点。

欢迎!请参阅 关于页面 获取更多有关如何使用本站的信息。

0
Clojure

问题:
当一个导入的类用作值时,生成的字节码使用 {{RT.classForName}} 获取 Class 对象,导致类被加载并执行静态初始化器。这与在 (链接: http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4.1 中 Java 调用静态初始化器) 时不同,使得在使用依赖于 Java 语法的代码时使用 clojure 变得更加困难。

动机
有些代码有仅在特定环境中执行的静态初始化器。一个主要的例子是 JavaFX,其中许多 JavaFX 类需要在任何静态初始化器运行之前启动 JavaFX 平台。

考虑以下代码

`
(import 'javafx.scene.control.Cell)

(defn f [] Cell)
`

目前无法编译和执行(例如使用 "{{clj example.clj}}" 并使用 clojure-1.9.0beta2)并因 {{CompilerException java.lang.ExceptionInInitializerError}} 失败,根本原因 "工具箱未初始化"。这种将 {{Cell}} 作为 {{f}} 的返回值的用法导致类被加载和初始化。

方法
当正在输出的值是类时,修改 ObjExpr.emitValue 以输出对 {{RT.classForNameNonLoading}} 的调用而不是 {{RT.classForName}}。

补丁
https://dev.clojure.org/jira/secure/attachment/17426/CLJ-2250-avoid-initializing-class-when-used-as-value.patch

现有技术
{{import}} 表达式先前被更改,类似于不加载类 ((链接: https://dev.clojure.org/jira/browse/CLJ-1315 文本:CLJ-1315)) 以及 (链接: https://dev.clojure.org/jira/browse/CLJ-1743 文本:CLJ-1743)尝试解决 Clojure 与 Java 语义不同的类似问题。

2 答案

0

评论者:ragge

添加补丁。

0
参考: https://clojure.atlassian.net/browse/CLJ-2250 (由ragge报告)
...