我试图将句柄放在编译时不可用但在运行时可用的 Java 对象上,如下所示:
(def component-manager (delay (SomeJavaObject/getHandle)))
(如果有比延迟更好的机制可用,这将是受欢迎的)。
使用这些对象时,会生成反射警告。由于有时这些相当频繁,我试图通过以下方式避免它:
(def my-handle ^SomeJavaObject (delay (SomeJavaObject/getHandle)))
不幸的是,在这种情况下仍然会产生反射警告。
修改参考作品:
(.foo ^SomeJavaObject @my-handle)
...但这大大丑化了代码。
包装在添加类型提示的宏中似乎是一种明显的方法:
(def my-handle' (delay (SomeJavaObject/getHandle)))
(defmacro my-handle []
(with-meta '(deref my-handle')
{:tag SomeJavaObject}))
...看起来它应该做正确的事情:
=> (set! *print-meta* true)
=> (macroexpand '(my-handle))
^SomeJavaObject (deref my-handle')
...但是当橡胶上路时,这并不成立:
=> (.foo (my-handle))
Reflection warning, NO_SOURCE_PATH:1 - reference to field foo can't be resolved.
这样做的正确方法是什么?