5

我编写了一个相当原始的测试程序(我正在为 LWJGL 的 OpenGL 类编写一个包装器,主要是出于美观的原因,我决定将多线程带入其中,因为我之前实际上从未编写过并发程序)。程序完成后,我总是收到警告

我实际上在程序进入主函数之前得到了警告。很抱歉造成混淆(我认为这可能根本不是我的程序,而是 clojure 本身的东西):

Reflection warning, NO_SOURCE_PATH:1 - call to invokeStaticMethod can't be resolved.

我在编译期间没有收到任何警告,我觉得这很奇怪。无论如何,这是程序:

(ns opengltuts.core
  (:import (org.lwjgl.opengl GL11 Display))
  (:use opengltuts.opengl)) ;my wrapper

(def world-state (ref {:running true :color [1.0 0.0 0.0 1.0]}))

(defn render-world [state]
  (apply glClearColor (:color state))
  (glClear GL11/GL_COLOR_BUFFER_BIT)
  (Display/update))

(defn render []
  (Display/create)
  (loop []
    (let [world @world-state]
      (when (:running world)
        (do (render-world world)
          (recur)))))
  (Display/destroy))

(defn -main []
  ; without the annotation, I get a warning here too.
  (let [render-thread (doto (Thread. ^Runnable render) (.start))]
    (Thread/sleep 3000)
    (dosync (commute world-state assoc :color [0.0 1.0 0.0 1.0]))
    (Thread/sleep 3000)
    (dosync (commute world-state assoc :running false))
    (.join render-thread)))

这可能不是太惯用(我听说在 Clojure 中你通常不使用 启动线程new Thread,而是使用 Agents 或其他东西,但我还没有完全掌握它是如何工作的),但我猜对于这么短的程序没关系。

4

1 回答 1

0

您的 Clojure 源代码正在运行时加载和编译(请参阅http://clojure.org/compilation),这就是为什么您在程序执行之前看不到反射警告的原因。

很难确定您在哪里对静态方法进行反射调用,因此我推荐以下步骤:

  1. 添加(:gen-class)到您的(ns)声明中
  2. 添加(set! *warn-on-reflection* true)(binding [*warn-on-reflection* true] body)您怀疑正在发生反射调用的位置。
于 2012-10-15T13:49:52.673 回答