Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.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
从clojure操作java对象_Clojure_Functional Programming_Clojurescript_Clojure Contrib - Fatal编程技术网

从clojure操作java对象

从clojure操作java对象,clojure,functional-programming,clojurescript,clojure-contrib,Clojure,Functional Programming,Clojurescript,Clojure Contrib,我是clojure的新手,希望使用clojure与java对象交互。如果我能很好地理解, 可以使用defprotocol实现此交互。 我具体想做的是: 1-我有以下java类 package mytestspackage; public class TestObject { private String lastName; private String firstName; private String age; public TestObject(Stri

我是clojure的新手,希望使用clojure与java对象交互。如果我能很好地理解, 可以使用defprotocol实现此交互。 我具体想做的是:

1-我有以下java类

package mytestspackage;

public class TestObject {

    private String lastName;
    private String firstName;
    private String age;

    public TestObject(String lastName, String firstname, String age) {
        super();
        this.lastName = lastName;
        this.firstName = firstname;
        this.age = age;
    }

    public String getName() {
        return this.lastName;
    }

    public void setName(String name) {
        this.lastName = name;
    }

    public String getFirstname() {
        return this.firstName;
    }

    public void setFirstname(String vorname) {
        this.firstName = vorname;
    }

    public String getAge() {
        return this.age;
    }

    public void setAge(String age) {
        this.age = age;
    }

}
2-我创建了一个clojure协议,它应该允许我访问上述java类TestObject的实例

现在我的问题是:我在哪里具体实现协议中定义的方法,以及如何使用此实现将TestObject实例传递给clojure端并访问诸如名字、姓氏等值

任何帮助都将不胜感激。 提前谢谢

你好,霍勒斯

如果我已经很好地理解了,可以使用 解除协议

不,你搞错了。协议旨在允许类似于普通java中接口所允许的东西(尽管功能更强大)。您可以不使用任何协议访问Java类。关于此主题的官方clojure文件:

例如:

(ns example
  (:import mytestpackage.TestObject))

;; This is how we call methods on java objects    

(defn first-name [obj]
  (.getFirstname obj))

(defn last-name [obj]
  (.getName obj))

(defn age [obj]
  (.getAge obj))

(defn set-first-name [obj name]
  (.setFirstname obj name))

(defn set-last-name [obj name]
  (.setName obj name))

(defn set-age [obj age]
  (.setAge obj age))

;; In REPL

example => (let [x (TestObject. nil nil nil)      ;; This is how we create Java objects
                 x (new TestObject nil nil nil)]  ;; These expressions are equivalent
              (println (first-name x))
              (set-first-name x "Name")
              (println (first-name x))
              (set-last-name x "Last name")
              (set-age x "23")
              (println (last-name x))
              (println (age x)))
;; Outputs
nil
Name
Last name
23

请注意,这段代码只不过是介绍java互操作的示例。决不应该编写这样的真实程序,尤其是当它们主要在Clojure中时。

如果您只想使用Clojure与java对象交互,而不想在它们上实现新功能,那么您不需要担心协议。Clojure为java方法调用提供了直接访问和语法

例如,Clojure中的字符串是java.lang.String对象:

user=> (type "Really a Java String")
;; java.lang.String

user=> (.toUpperCase "Really a java string")
;;=> "REALLY A JAVA STRING"
如果测试对象类位于类路径上,则可以创建如下实例:

user=> (def a-test-object (mytestpackage/TestObject. "lastName" "firstName" 42))
和调用方法,如:

user=> (.getAge a-test-object)
有关更多信息,请参阅

user=> (.getAge a-test-object)