In Clojure, how can I read public member variables of an instance of a Java class?

In Clojure, how can I read public member variables of an instance of a Java class? I need something like:

 (. instance publicMemberName)

I also tried:

instance/publicMemberName 

but this only works with static methods

+5
source share
2 answers

In Java, a class java.awt.Pointhas public fields xand y. See Javadocs here http://download.oracle.com/javase/6/docs/api/java/awt/Point.html .

In Clojure, a point macro works for fields and methods. This worked for me:

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

EDIT: also works (note the space between the dot and p):

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

EDIT: , , 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
+11

Java bean getFoo foo, (.. ), bean. Clojure, , .

user> (bean (java.awt.Point. 1.0 2.0))
{:y 2.0, :x 1.0, :location #<Point java.awt.Point[x=1,y=2]>, :class java.awt.Point}

user> (:x *1)
1.0
+2

All Articles