Я работаю над некоторым Java / совместимость Clojure и столкнулся с предупреждением отражения для следующего кода:
(defn load-image [resource-name]
(javax.imageio.ImageIO/read
(.getResource
(class javax.imageio.ImageIO)
resource-name)))
=> Reflection warning, clojure/repl.clj:37 - reference to field read can't be resolved.
Я удивлен этим, потому что getResource всегда возвращает URL, и я поэтому ожидал бы, что компилятор будет использовать соответствующий статический метод в javax.imageio. ImageIO/read.
Код хорошо работает BTW, таким образом, он ясно находит правильный метод во время выполнения.
Так два вопроса:
AFAICS это не имеет никакого отношения к вашему коду или компиляции. Это часть функции source-fn в REPL :
...
(let [text (StringBuilder.)
pbr (proxy [PushbackReader] [rdr]
(read [] (let [i (proxy-super read)]
(.append text (char i))
i)))]
...
и используется для отображения исходного кода в оболочке REPL, AFAICT.
Для тех, кто нашел этот пост (как и я) и задается вопросом, почему они получают предупреждения об отражении при использовании proxy-super
...
Каждый метод прокси имеет неявное this
first arg, который, увы, не имеет типовой подсказки (предположительно потому, что прокси-сервер реализует ряд возможных типов, а результирующий прокси-класс создается позже).
Итак, если вы когда-нибудь вызовете методы на this
изнутри прокси (что и делает proxy-super
), вы увидите предупреждения об отражении.
Простое решение - просто заключить ваш код в let
, который использует подсказку типа. Например: [
(let [^SomeClass this this]
(proxy-super foo)
(.bar this))