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
by

由:alexmiller

看起来,这打破了序列化的对象在(实际上很脆弱)clojure.test-clojure.java-interop/test-proxy-non-serializable(参见CLJ-2204,CLJ-2330)。

0
by

由:bronsa

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

0
by
参考:https://clojure.atlassian.net/browse/CLJ-2379(报告者:bronsa)
...