我是 clojure 的新手,想使用 clojure 与 java 对象进行交互。如果我很好理解,
可以使用 进行此交互默认协议(protocol) .
我具体尝试做的是以下内容:
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 协议(protocol),它应该允许我访问上述 java 类 TestObject 的实例
(ns mytestspackage)
(defprotocol Test
(first-name [t])
(last-name [t])
(age [t]))
现在我的问题是:我在哪里具体实现协议(protocol)中定义的方法以及如何使用此实现将 TestObject 实例传递到 clojure 端并访问名字、姓氏等值...
任何帮助,将不胜感激。
提前致谢。
问候,贺拉斯
最佳答案
If I have well understood, one can reach this interaction using defprotocol.
不,你搞错了。协议(protocol)旨在允许类似于普通 java 中的接口(interface)允许的事情(尽管更强大)。您可以在没有任何协议(protocol)的情况下访问您的 Java 类。有关此主题的官方 clojure 文档:http://clojure.org/java_interop
例子:
(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 - 从 clojure 操作 java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15162732/