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 用户.proxy$java.lang.Object$I$383c225e 无法转换为 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
`

原因: proxy 使用一组类名缓存生成的类(见 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
by

评论由:alexmiller

看起来这破坏了(title clojure.test-clojure.java-interop/test-proxy-non-serializable中(坦率地说是薄弱的)序列化对象(见CLJ-2204, CLJ-2330))。

0
by

评论由:bronsa

如#clojure-dev中讨论的那样,附上了禁用薄弱测试并恢复proxy-name确定性的补丁。

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