有没有办法在clojure中扩展抽象类?我希望在clojure中扩展java.lang.Classloader。有没有一种很好的方法来获取Classloader对象的子类而不返回java?
答案 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来覆盖受保护的方法,但是它们没有其他访问受保护成员的权限,也没有超级权限,因为这些功能无法代理。