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

在Clojure中,如何读取Java类实例的公共成员变量?,clojure,Clojure,在Clojure中,如何读取Java类实例的公共成员变量?我想要像这样的东西: (. instance publicMemberName) 我还尝试: instance/publicMemberName 但是这只适用于静态方法在Java中,类Java.awt.Point具有公共字段x和y。请参阅这里的javadocs 在Clojure中,点宏适用于字段和方法。这对我很有用: user=> (let [p (new java.awt.Point 2 4)] (.x p)) 2 编辑

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

 (. instance publicMemberName)
我还尝试:

instance/publicMemberName 

但是这只适用于静态方法

在Java中,类
Java.awt.Point
具有公共字段
x
y
。请参阅这里的javadocs

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

user=> (let [p (new java.awt.Point 2 4)] (.x p))
2
编辑:以下内容也适用(请注意点和p之间的间距):

编辑:考虑到
java.awt.Point
除了公共字段
x
y
之外,还有方法
getX
getY
,我决定做一个完整的例子。这就来了。首先创建一个如下所示的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

如果您的对象遵循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
user>(bean(java.awt.Point.1.0.2))
{:y2.0,:x1.0,:location#,:class java.awt.Point}
用户>(:x*1)
1

你的意思是
(.member-instance)
而不是
(.instance-member)
?我的意思是(.instance-member)。您是指(.member实例)还是(.member实例)?无论如何,谢谢,我已经修改了这个问题,让它更清楚。呃,我不知道另一种形式。谢谢如果您想获得许多或所有PublicMemberName,可以使用(bean实例)将POJO转换为Clojure映射,这很好。(.px)也可以吗?使用Java函数,您可以执行(.fn实例)和(.fn实例)。如果C中的x发生了变化,该怎么办?正如clojure添加到java项目中一样
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