Clojure 调整用于导入的类加载器

Clojure 调整用于导入的类加载器,clojure,Clojure,在Clojure中使用import表单时,我希望该表单使用的JavaSourceClassLoader,以便在尝试导入类时,此自定义加载程序将查看Java源目录并动态编译导入的Java类 在我的Leiningen项目的根目录下,我有一个dynjava/目录,我把Java源文件放在那里。我编写了一些代码来构造JavaSourceClassLoader: (ns playground.classloading (:import [org.codehaus.janino JavaSourceCla

在Clojure中使用
import
表单时,我希望该表单使用的
JavaSourceClassLoader
,以便在尝试导入类时,此自定义加载程序将查看Java源目录并动态编译导入的Java类

在我的Leiningen项目的根目录下,我有一个
dynjava/
目录,我把Java源文件放在那里。我编写了一些代码来构造JavaSourceClassLoader:

(ns playground.classloading
  (:import [org.codehaus.janino JavaSourceClassLoader])
  (:require [clojure.java.io :as io]))

(defn current-loader []
  (.deref clojure.lang.Compiler/LOADER))

(defn make-source-loader
  ([]
   (make-source-loader (current-loader)))
  ([parent]
   (JavaSourceClassLoader.
    parent
    (into-array [(io/file "dynjava")])
    nil)))
我有一个示例文件,
dynjava/Magic.java
,看起来像这样,以便测试它:

public class Magic {
    public int getNumber() {
        return 119;
    }
}
实际上,我可以在REPL中编译、加载和创建这个类的实例,例如

(.getNumber (.newInstance (.loadClass (make-source-loader) "Magic")))
;; => 119
现在我想将JavaSourceClassLoader与
import
表单一起使用,所以我尝试了以下方法:

(def src-loader (make-source-loader))

(.bindRoot clojure.lang.Compiler/LOADER src-loader)
(.set clojure.lang.Compiler/LOADER src-loader)


(println "The var is " clojure.lang.Compiler/LOADER)
(if (.isBound clojure.lang.Compiler/LOADER)
  (println "The compiler loader is "
           (.deref clojure.lang.Compiler/LOADER)))
其中显示以下内容:

我的问题是:如何将Clojure中的
import
使用的类加载器更改为JavaSourceClassLoader的实例

(顺便说一句,我知道lein virgil,但随着我的项目越来越大,我在使用它时遇到了一些问题。)

The var is  #<Var: --unnamed-->
The compiler loader is  #object[clojure.lang.DynamicClassLoader 0x9b1fcd3 clojure.lang.DynamicClassLoader@9b1fcd3]
playground.classloading>
;; (import 'Magic) results in an Error