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