在Clojure中,我如何读取Java类实例的公共成员变量?我想要这样的东西:
(. instance publicMemberName)
我也尝试过:
instance/publicMemberName
但这仅适用于静态方法
答案 0 :(得分:12)
在Java中,课程java.awt.Point
包含公开字段x
和y
。请参阅此处的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
除了公共字段getX
和getY
之外还有方法x
和y
。所以这里。首先创建一个这样的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