【问题标题】:In Clojure how can I read a public member variables of an instance of a Java class?在 Clojure 中,如何读取 Java 类实例的公共成员变量?
【发布时间】:2011-07-11 07:33:04
【问题描述】:

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

 (. instance publicMemberName)

我也试过了:

instance/publicMemberName 

但这仅适用于静态方法

【问题讨论】:

  • 你的意思是(. member instance)而不是(. instance member)
  • 我的意思是(.实例成员)。你的意思是(.member instance)还是(.member instance)?无论如何,谢谢我已经修改了问题以使其更清楚
  • 呃,我不知道其他形式。谢谢!
  • 如果您想获得许多或全部的 publicMemberNames,您可以将 POJO 转换为带有(bean 实例)的 Clojure 映射,这很好。

标签: clojure


【解决方案1】:

在 Java 中,类 java.awt.Point 具有公共字段 xy。请参阅此处的 javadocs 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 除了公共字段xy 之外还有方法getXgetY。所以这里。首先制作一个这样的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

【讨论】:

  • (.p x) 也可以吗?使用 Java 函数,您可以执行 (.fn instance) AND (. instance fn)。
  • 如果 C 中的 x 发生变化怎么办?如在clojure中被添加到一个java项目中
【解决方案2】:

如果您的对象遵循getFoo 的Java bean 约定来访问成员字段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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 2022-12-09
    • 1970-01-01
    • 2013-08-26
    • 2015-05-04
    相关资源
    最近更新 更多