似乎无法使用代理覆盖Object.finalize()。如果使用代理定义了该方法,则无法直接调用(见下文),并且在正常程序执行期间不会被调用作为终结器(以下未演示)。
更多信息请参见: https://groups.google.com/group/clojure/browse_thread/thread/a1e2fca45af6c1af
{引用}
user=> (def m (proxy [java.util.HashMap] ()
(finalize (link: )
;(proxy-super finalize)
(prn "finalizing..."))
(hashCode (link: )
99)))
'user/m
user=> (.hashCode m)
99
user=> (.finalize m)
IllegalArgumentException No matching field found: finalize for class user.proxy$java.util.HashMap$0 clojure.lang.Reflector.getInstanceField (Reflector.java:289)
{引用}
这里至少有两个问题(感谢 Cedric Greevey 的总结)
- 如果无法覆盖 finalize() 是无意中发生的,那是错误。
- 如果这是出于某种原因有意为之,那么(a)没有文档说明,并且(b)错误是静默的,因为在显式调用时会产生一个看似完全不相关的错误(上面),并且在整个对象最终化期间不会调用该方法。