Java 使用Clojure的静态方法
我试图在Clojure中实现以下内容:Java 使用Clojure的静态方法,java,clojure,Java,Clojure,我试图在Clojure中实现以下内容: (ns harrow.http (:require ; harrow ; external [clojure.tools.logging :as log ] ) (:import [org.rapidoid.config Conf ] [org.rapidoid.setup On OnRoute ] [org.rapidoid.htt
(ns harrow.http
(:require
; harrow
; external
[clojure.tools.logging :as log ] )
(:import
[org.rapidoid.config Conf ]
[org.rapidoid.setup On OnRoute ]
[org.rapidoid.http.impl RouteOptions ]
[org.rapidoid.http Req ]
[org.rapidoid.u U ]
[java.util Map LinkedHashMap ] ) )
(gen-class
:name harrow.EchoHandler
:methods [ #^{:static true} [handleEcho [org.rapidoid.http.Req] java.util.Map]] )
(defn -handleEcho ^Map [^Req req] (U/map (.headers req)))
处理程序:
// http/handlers/EchoHandler.java
package http.handlers;
import org.rapidoid.http.Req;
import org.rapidoid.u.U;
import java.util.Map;
public class EchoHandler {
public static Map<String, String> handleEcho(Req req) {
return U.map(req.headers());
}
}
现在尝试在Clojure中执行同样的操作:
(ns harrow.http
(:require
; harrow
; external
[clojure.tools.logging :as log ] )
(:import
[org.rapidoid.config Conf ]
[org.rapidoid.setup On OnRoute ]
[org.rapidoid.http.impl RouteOptions ]
[org.rapidoid.http Req ]
[org.rapidoid.u U ]
[java.util Map LinkedHashMap ] ) )
(gen-class
:name harrow.EchoHandler
:methods [ #^{:static true} [handleEcho [org.rapidoid.http.Req] java.util.Map]] )
(defn -handleEcho ^Map [^Req req] (U/map (.headers req)))
使用它:
harrow.main=> (def config-get-route (http/set-http-get-route "/echo"))
harrow.main=> (import harrow.EchoHandler)
harrow.EchoHandler
harrow.main=> (.json config-get-route EchoHandler/handleEcho)
CompilerException java.lang.RuntimeException: Unable to find static field: handleEcho in class harrow.EchoHandler, compiling:(/private/var/folders/nr/g50ld9t91c555dzv91n43bg40000gn/T/form-init16236167396076700327.clj:1:1)
我想知道在Clojure中使用静态方法的正确方法是什么。首先,您不能将静态方法作为函数传递-您必须 用anon fn把它包起来 撇开这一点不谈,这也行不通,因为这个框架期望 实现某些接口的实例。由于Java8,您可以编写 作为lambdas和javac,如果接口只是 有一种方法 因此,您不能简单地传入Clojure函数,该函数实现。
IFn
和Runnable
,但不需要特定的接口。所以
您必须从文档中查找允许的内容,并将其具体化
例如,使用Rapidoid 5.5.5时,它可以如下所示:
(ns try-rapidoid.core
(:import (org.rapidoid.http ReqHandler)
(org.rapidoid.setup On Setup)))
(def echo-route
(doto
(On/get "/echo")
(.managed true)
(.json (reify ReqHandler ; XXX
(execute [this ^Object req]
(.headers req))))))
#_(Setup/shutdownAll)
首先,您不能将静态方法作为函数传递—您必须这样做 用anon fn把它包起来 撇开这一点不谈,这也行不通,因为这个框架期望 实现某些接口的实例。由于Java8,您可以编写 作为lambdas和javac,如果接口只是 有一种方法 因此,您不能简单地传入Clojure函数,该函数实现。
IFn
和Runnable
,但不需要特定的接口。所以
您必须从文档中查找允许的内容,并将其具体化
例如,使用Rapidoid 5.5.5时,它可以如下所示:
(ns try-rapidoid.core
(:import (org.rapidoid.http ReqHandler)
(org.rapidoid.setup On Setup)))
(def echo-route
(doto
(On/get "/echo")
(.managed true)
(.json (reify ReqHandler ; XXX
(execute [this ^Object req]
(.headers req))))))
#_(Setup/shutdownAll)
首先,您不能将静态方法作为函数传递-您必须将其包装在anon fn中。另外,我打赌那里的java代码使用一个方法接口,javac在那里为您构建处理类。因此,您很可能需要具体化
json
方法所期望的接口。谢谢您提供的信息。你介意给我举个例子吗?如何用anon fn包装这个?提前谢谢!首先,您不能将静态方法作为函数传递-您必须将其包装在anon fn中。另外,我打赌那里的java代码使用一个方法接口,javac在那里为您构建处理类。因此,您很可能需要具体化json
方法所期望的接口。谢谢您提供的信息。你介意给我举个例子吗?如何用anon fn包装这个?提前谢谢!