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

欢迎!请参阅关于页面以获取更多关于如何工作的信息。

0
Java互操作

补丁前

`
user=> (definterface I (f []))
user.I
user=> (def p (proxy [Object I] [] (f [] 1)))

'user/p

user=> (definterface I (f []))
user.I
user=> (def p (proxy [Object I] [] (f [] 1)))

'user/p

user=> (.f ^I p)

ClassCastException: user.proxy$java.lang.Object$I$383c225e cannot be cast to user.I user$eval7491.invokeStatic (:1)
`

补丁后

`
user=> (definterface I (f []))
user.I
user=> (def p (proxy [Object I] [] (f [] 1)))

'user/p

user=> (definterface I (f []))
user.I
user=> (def p (proxy [Object I] [] (f [] 1)))

'user/p

user=> (.f ^I p)
1
`

原因:使用一组类名(见https://github.com/clojure/clojure/blob/master/src/clj/clojure/core_proxy.clj#L280-L286)来缓存生成的类,这在重新定义接口的情况下是不安全的。

建议:改变确定代理类缓存命中所使用的哈希函数,以考虑每个接口/超类的身份,而不仅仅是它们的名称。

补丁:0001-CLJ-2379-idempotent-proxy-name-just-on-identical-ins-v2.patch

6 答案

0

由: alexmiller

您能否在描述中添加一行来解释更改?

0

由: alexmiller

我不确定我理解了这个问题/解决方案。

0

由: bronsa

当然,完成了

0

由: alexmiller

看起来这破坏了序列化对象,特别是在(clojure.test-clojure.java-interop/test-proxy-non-serializable中,这个测试确实是脆弱的)(请参阅CLJ-2204, CLJ-2330)。

0

由: bronsa

在#clojure-dev中讨论过,附上的补丁禁用了脆弱的测试,并使proxy-name的可预测性得到恢复。

0
参考:[https://clojure.atlassian.net/browse/CLJ-2379](https://clojure.atlassian.net/browse/CLJ-2379) ( 由 bronsa 报告)
...