Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Clojure使用静态方法生成类_Java_Clojure_Interop - Fatal编程技术网

Java 从Clojure使用静态方法生成类

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) { /* ... */ }

我有一个Clojure库,我想在Java中使用它,但在生成正确的类时遇到了困难。我想生成一个有效的类:

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令牌存储内容(如纯Clojure
my.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");
    }
}