Java 从Clojure使用静态方法生成类
我有一个Clojure库,我想在Java中使用它,但在生成正确的类时遇到了困难。我想生成一个有效的类:Java 从Clojure使用静态方法生成类,java,clojure,interop,Java,Clojure,Interop,我有一个Clojure库,我想在Java中使用它,但在生成正确的类时遇到了困难。我想生成一个有效的类: public class TokenStore { public static TokenStore Sns(Map<String, String> services) { /* ... */ } public String addToken(String token, String username, String service) { /* ... */ }
public class TokenStore {
public static TokenStore Sns(Map<String, String> services) { /* ... */ }
public String addToken(String token, String username, String service) { /* ... */ }
public String findToken(String username, String service) { /* ... */ }
public String sendNotification(String username, String service, String message) { /* ... */ }
}
但当我试图编译它时,我得到:
: jmglov@alhana; lein jar
Compiling orron-iii.push-java
Exception in thread "main" java.lang.ClassNotFoundException: java.lang.TokenStore, compiling:(orron_iii/push_java.clj:1:1)
有谁能给我一个简单的例子来说明如何做到这一点吗?这不是对我问题的直接回答,但它可能是实现我想要的更好的方法。这有点像“医生,我这样做会很痛。”“那就别那样做了!”诸如此类的话 我使用标准
gen类
foo创建了一个扩展java.lang.Object
的类,并整齐地包装了我的Clojure令牌存储内容(如纯Clojuremy.lib.token
文件中定义的)
现在,我可以从Java中这样使用它:
import my.lib.TokenStore;
import java.util.Arrays;
public class TokenTool {
public static void main(String[] args) {
TokenStore tokenStore = new TokenStore(Arrays.asList("APNS", "arn:aws:sns:..."));
String deviceId = tokenStore.findDevice("APNS", "foo");
System.out.println("Device is: " + deviceId);
tokenStore.sendNotification("APNS", "foo", "Test for echo");
}
}
这似乎工作得很好。尝试将:方法部分中的TokenStore更改为my.lib.TokenStore.Nope,这没有帮助。是的,协议和类具有相同名称的事实可能会导致冲突,因为协议会生成自己的接口。我的建议是使用您想要的方法签名在Java中定义TokenStore接口,然后在Clojure中创建一个工厂类,生成该接口的实现。但你的方式也很有效。
(ns my.lib.token-java
(:require [my.lib.token :as t])
(:gen-class
:name my.lib.TokenStore
:constructors {[java.util.List] []}
:init initialise
:state localstate
:methods [[addToken [String String String] String]
[findToken [String String] String]
[sendNotification [String String String] String]]))
(defn- keywordise [coll]
(flatten (map (fn [[k v]] [(keyword k) v]) (partition 2 coll))))
(defn -initialise [services]
(let [token-store (apply t/sns-token-store (keywordise services))]
[[] (ref token-store)]))
(defn -addToken [this service username token]
(t/add-token @(.localstate this) (keyword service) username token))
(defn -findToken [this service username]
(t/find-token @(.localstate this) (keyword service) username))
(defn -sendNotification [this service username message]
(p/send-notification @(.localstate this) (keyword service) username message))
import my.lib.TokenStore;
import java.util.Arrays;
public class TokenTool {
public static void main(String[] args) {
TokenStore tokenStore = new TokenStore(Arrays.asList("APNS", "arn:aws:sns:..."));
String deviceId = tokenStore.findDevice("APNS", "foo");
System.out.println("Device is: " + deviceId);
tokenStore.sendNotification("APNS", "foo", "Test for echo");
}
}