В Clojure, как я могу прочитать открытые переменные-члены экземпляра класса Java? - PullRequest
6 голосов
/ 11 июля 2011

Как в Clojure я могу прочитать общедоступные переменные-члены экземпляра класса Java?Я хочу что-то вроде:

 (. instance publicMemberName)

Я также пытался:

instance/publicMemberName 

, но это работает только со статическими методами

Ответы [ 2 ]

12 голосов
/ 11 июля 2011

В Java класс java.awt.Point имеет открытые поля x и y. См. 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

РЕДАКТИРОВАТЬ: следующее также работает (обратите внимание на пробел между точкой и р):

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
2 голосов
/ 11 июля 2011

Если ваш объект следует соглашению 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...