使用clojure扩展java抽象类(java.lang.Classloader)

时间:2014-03-21 10:32:05

标签: clojure

有没有办法在clojure中扩展抽象类?我希望在clojure中扩展java.lang.Classloader。有没有一种很好的方法来获取Classloader对象的子类而不返回java?

3 个答案:

答案 0 :(得分:7)

在Clojure中扩展抽象类的一种方法是在:gen-class形式或ns宏中使用(gen-class)指令。例如:

(ns example.core
  (:gen-class
     :extends ClassLoader
     :name example.CustomClassLoader))

(defn -findClass [this name]
  (println "example.findClass")
  nil)

必须使用AOT编译才能使(gen-class)产生任何效果。请参阅Clojure API文档中的(gen-class)

注意:A. Webb已在另一个答案的评论中提出了这种方法。

答案 1 :(得分:5)

是。将抽象类提供给代理宏,如下所示:

(-> (proxy [ClassLoader] []
      (findResource [name]
        (java.net.URL. "http://somewhere")))
    (.findResource "doot"))

--> #object[java.net.URL 0x75dc3e1d "http://somewhere"]

答案 2 :(得分:0)

我不确定你是什么意思:

  

不返回java

但是,在Clojure中,您可以使用proxy macro,它是Clojure Java Interop工具包的一部分。

在你的REPL中:

  

(doc proxy)

     

扩展为代码,该代码通过调用提供的fns来创建实现命名类/接口的代理类实例。单个类(如果提供)必须是第一个。如果未提供,则默认为Object。接口名称必须是有效的接口类型。如果没有为类方法提供方法fn,则将调用超类方法。如果没有为接口方法提供方法fn,则在调用时将抛出UnsupportedOperationException。方法fns是闭包,可以捕获调用代理的环境。每个方法fn都采用一个额外的隐式第一个arg,它与此绑定。请注意,虽然可以提供方法fns来覆盖受保护的方法,但是它们没有其他访问受保护成员的权限,也没有超级权限,因为这些功能无法代理。