从clojure操作java对象
我是clojure的新手,希望使用clojure与java对象交互。如果我能很好地理解, 可以使用defprotocol实现此交互。 我具体想做的是: 1-我有以下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
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)