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

Zub*_*air 6 clojure

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

 (. instance publicMemberName)
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

instance/publicMemberName 
Run Code Online (Sandbox Code Playgroud)

但这只适用于静态方法

Ray*_*oal 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
Run Code Online (Sandbox Code Playgroud)

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

user=> (let [p (new java.awt.Point 2 4)] (. p x))
2
Run Code Online (Sandbox Code Playgroud)

编辑:我决定做一个完整的例子,因为java.awt.Point有方法getX,getY除了公共领域xy.所以这里.首先创建一个这样的Java类:

public class C {
    public int x = 100;
}
Run Code Online (Sandbox Code Playgroud)

编译它

$ javac C.java
Run Code Online (Sandbox Code Playgroud)

现在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
Run Code Online (Sandbox Code Playgroud)

注意另一种方式也适用:

user=> (let [q (new C)] (.x q))
100
Run Code Online (Sandbox Code Playgroud)

  • 为了它的乐趣:( - > p .x) (3认同)