请在 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 对象本身,抛出一个不同的异常(以指示哪个获取器展开失败,这样你可以再次尝试并告知它不要展开那个获取器)?

是的,这些说法都是正确的。因此,我的最低要求就是 `(j/from-java-deep Class {})` 不能抛出异常。考虑到我的解决方案,可能 `{:class java.lang.Class}` 对于这种情况来说并不是一个坏的结果。如果这样的行为有文档说明,用户就可以检测到这种情况下,并根据他们的使用情况进行相应的处理。在 `clojure.java.data` 中还有一些其他情况得到了特殊处理,所以这将是第n+1种情况。
...