我怀疑这可能与java-interop有关,因为我在代码中调用了很多java功能。
当我在我的REPL中运行以下代码(通过emacs)时,它完全按照它应该的方式工作
(def height 100)
(def image (BufferedImage. width height BufferedImage/TYPE_INT_ARGB))
(def graphics (.createGraphics image))
(.setColor graphics Color/black)
(for [x (range 0 width 10)]
(.drawLine graphics x 0 x height ))
(for [y (range 0 height 10)]
(.drawLine graphics 0 y width y))
(ImageIO/write image "png" (io/file "output.png"))网格的图像是正确生成的。
但是,如果我执行C-c C-k,它会生成一个空白图像。
现在,当我把它放在一个函数中并通过lein run运行它时,我得到了一个我不理解的警告:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by clojure.lang.InjectedInvoker/1832669781 (file:/home/n/.m2/repository/org/clojure/clojure/1.10.0/clojure-1.10.0.jar) to method sun.java2d.SunGraphics2D.setColor(java.awt.Color)
WARNING: Please consider reporting this to the maintainers of clojure.lang.InjectedInvoker/1832669781
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release我对clojure知之甚少,对java更是知之甚少,但我使用的是openjdk 10。
我相信我的代码是正确编写的(尽管写得很差),这是我的代码的问题还是clojure的问题?
发布于 2019-03-07 15:47:23
我怀疑你的问题是“for”并没有像你想的那样做。它会生成一个惰性序列。在REPL中,打印机通常会评估这些参数,但独立代码不会。
尝试将for替换为doseq。这将急切地执行您的副作用,并应改善问题。
非法访问警告是在转移视线。自从Java模块系统出现以来,就有一些特定的互操作模式生成它们。有关如何解决警告的详细信息,请参阅https://clojure.org/guides/faq#illegal_access上的Clojure FAQ
https://stackoverflow.com/questions/55037376
复制相似问题