在Clojure中,如何读取Java类实例的公共成员变量?

时间:2011-07-11 07:33:05

标签: clojure

在Clojure中,我如何读取Java类实例的公共成员变量?我想要这样的东西:

 (. instance publicMemberName)

我也尝试过:

instance/publicMemberName 

但这仅适用于静态方法

2 个答案:

答案 0 :(得分:12)

在Java中,课程java.awt.Point包含公开字段xy。请参阅此处的javadoc http://download.oracle.com/javase/6/docs/api/java/awt/Point.html

在Clojure中,点宏适用于字段和方法。这对我有用:

user=> (let [p (new java.awt.Point 2 4)] (.x p))
2

编辑:以下也有效(注意点和p之间的空格):

user=> (let [p (new java.awt.Point 2 4)] (. p x))
2

编辑:我决定做一个完整的例子,因为java.awt.Point除了公共字段getXgetY之外还有方法xy。所以这里。首先创建一个这样的Java类:

public class C {
    public int x = 100;
}

编译

$ javac C.java

现在将C.class移到clojure目录中。接下来启动REPL,导入类,并观察它是否有效:

$ java -cp clojure.jar clojure.main
Clojure 1.2.0
user=> (import C)
C
user=> (let [q (new C)] (. q x))
100

注意另一种方式也适用:

user=> (let [q (new C)] (.x q))
100

答案 1 :(得分:2)

如果您的对象遵循getFoo的Java bean约定来访问成员字段foo,并且您只需要读访问权(即不会改变您的对象),您可以使用{{ 1}}。这将为您提供模仿对象的不可变Clojure映射,然后您可以使用标准关键字访问器。

bean