2024 Clojure 状态调查!中分享您的想法。

欢迎!请查阅关于页面以获取关于如何使用本网站的一些更多信息。

0 投票
java.data

(clojure.java.data/from-java-deep Class {}) 抛出 StackOverflowError

文档没有提及这一点,但我想看到 java.data 对此情况进行处理。

您可以在https://github.com/henrik42/java.data-with-Class/tree/master中找到一个简短示例。

这显示了错误。

clj -X main/this-call-throws
Execution error (StackOverflowError) at clojure.java.data/add-deep-getter-fn (data.clj:121).

作为一个折衷办法,我正在使用 (defmethod j/from-java-deep Class [clazz _] {:class clazz}) -- 但这并不是真正的解决方案,因为它甚至不会提供 (from-java-shallow Class {}) 将提供的。

clj -X main/this-call-works
(j/from-java-deep Class) ;=>  {:class java.lang.Class}

使用

(defmethod j/from-java-deep Class [clazz _] (j/from-java-shallow Class {}))

并没有好很多,因为这也不是深拷贝。

3 个回答

0 投票

已选择
 
最佳答案

https://clojure.atlassian.net/browse/JDATA-23 -- 我可能这个月无法处理这个问题,但对确切解决方案的分析仍然是必要的。

0 投票

clojure.java.reflect 是否更适合你尝试做的任务?

类及其字段存在显然的循环。

我真的很想使用 clojure.java.data 及其转换逻辑。由于我无法控制使用的类,如果能 c.j.d 不会对 java.lang.Class 抛出异常就太好了。从那时起,我就没有问题了,也知道该怎么做。
0 投票

我的问题是

你认为 (j/from-java-deep Class {}) 应该产生什么?

当你进行 (j/from-java-shallow Class {}) 时,你会看到很多类型为 Class 数组的属性,如果你尝试将这些从 Java 到 Clojure 的“转换”,你会得到递归 -- 并且在 Class 的情况下,这个递归没有“底部”。

为了让 from-java-deep 在这里不会崩溃,需要对这个递归有一些“底部”。或者是一个任意的深度,或者跟踪你看到的所有 Java 对象,并且在树的下方不再扩展相同对象(假设该检查足以创建“底部”)。但问题仍然存在,from-java-deep 在这一点上应该做什么:对该子树返回 nil,返回其他信号值,返回 Java 对象本身,抛出不同的异常(以指示哪个 getter 扩展失败,这样您可以再试一次并指示不要扩展该 getter)?

是的,这些都是真的。因此,我的最低要求是 `(j/from-java-deep Class {})` 不抛出异常。考虑到我的解决方案,可能 `{:class java.lang.Class}` 对这种情况来说并不坏。如果这个情况被记录了下来,用户就可以检测到这种情况,并执行他们认为适用于其使用场景的任何操作。在 `clojure.java.data` 中还有其他一些情况受到特殊处理,所以这将是第 n+1 个案例。
...