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 无法转换为 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

由: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 报告)
...