clojure: не может получить доступ к закрытым полям в одном пакете - PullRequest
5 голосов
/ 04 апреля 2011

В моей программе clojure я не могу получить доступ к полям области пакета класса java com.foo.Foo, хотя я нахожусь в пространстве имен "com.foo" (через "(ns com.foo)" в верхней части моей программы clojure).Однако открытые поля в com.foo.Foo доступны.

Почему?

1 Ответ

1 голос
/ 04 апреля 2011

Две проблемы здесь:

Во-первых, пространство имен com.foo компилируется в класс foo_wh независимо от пакета com; не скомпилировано с классом в пакете com.foo.

См:

user> (ns com.foo)
nil
com.foo> 
nil
com.foo> (defn hello[] "hello !")
#'com.foo/hello
com.foo> (class hello)
com.foo$hello
com.foo> (ns com.foo.hello)
nil
com.foo.hello> (defn hi[] "hi !")
#'com.foo.hello/hi
com.foo.hello> (class hi)
com.foo.hello$hi

Во-вторых, при поиске конструкторов или полей компилятор Clojure использует методы getConstructor и getFields из java.lang.Class, которые по спецификации возвращают только публичные конструкторы и открытые поля .

Итак, неудача здесь. Похоже, вы не сможете получить доступ к полям, защищенным пакетами.

Редактировать , отвечая на комментарии. Наилучшим подходом для доступа к полям уровня пакета в унаследованном коде Java было бы написание класса на Java, который обертывает существующий класс и предоставляет доступ к защищенным пакетам методам и полям из этого класса с помощью открытых методов. Таким образом, вы сможете лучше контролировать имя и пакет сгенерированного класса.

Эта оболочка представляет собой небольшой объем кода Java, и оттуда вы можете получить доступ к полям из кода Clojure.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...