Проблема с доступом к статическому полю класса Java

Мне необъяснимо трудно делать то, что я считал простотой. У меня есть файл JAR на моем пути к классам. Я нахожусь в Emacs, использую SLIME REPL, и я пытаюсь получить доступ к статическому полю экземпляра класса Java (один внутри JAR).

Вот мой класс:

public class MainFrame extends JFrame implements WindowListener,
        TreeSelectionListener {
    JPanel panel;
    InfocardWindow infoWindow;
    InfocardBuilder infocardBuilder;
    Main infomlFile;
    static NotecardModel setupModel;
    ...

Когда я попробовал:

infwb.cardmaker> (import 'javax.swing.JFrame)
javax.swing.JFrame
infwb.cardmaker> (import 'org.infoml.infocardOrganizer.MainFrame)
org.infoml.infocardOrganizer.MainFrame
infwb.cardmaker> MainFrame/setupModel
; Evaluation aborted.

Сообщение об ошибке было:

Unable to find static field: setupModel in class org.infoml.infocardOrganizer.MainFrame
  [Thrown class java.lang.Exception]

Я попытался переключиться на более простую задачу: получить доступ к нестатическому полю. Я сделал это внутри let, чтобы исключить возможность того, что выполнение этого из REPL может быть источником проблемы:

infwb.cardmaker> (let [mainFr (MainFrame.)]
  (println (.panel mainFr)))
; Evaluation aborted.

Сообщение об ошибке было:

No matching field found: panel for class org.infoml.infocardOrganizer.MainFrame
  [Thrown class java.lang.IllegalArgumentException]

Тот же результат получил при замене (.panel mainFr) и (println (. mainFr panel) в теле let. Кроме того, никаких изменений при переключении REPL на пространство имен user. (Конечно, это отчаяние вуду-тряски курицы.)

Запросы Google, такие как «emacs slime clojure не удается получить доступ к полю класса Java, ошибка« Невозможно найти статическое поле »» не дают ничего полезного - большинство из них связано с попыткой вызова методов класса Java (без доступа к полям класса Java).

Чтобы быть внимательным, я попробовал:

user> (let [mainFr (MainFrame.)]
  MainFrame/setupModel)
; Evaluation aborted.

Сообщение об ошибке было, как и раньше:

Unable to find static field: setupModel in class org.infoml.infocardOrganizer.MainFrame
  [Thrown class java.lang.Exception]

Итог: учитывая экземпляр MainFrame, что мне нужно сделать для доступа к статическому или нестатическому полю? Спасибо за любую помощь или подсказки, которые вы можете предоставить.


person Gregg Williams    schedule 19.06.2011    source источник
comment
разве вы не упустили модификатор public? на данный момент, чтобы получить доступ к setupModel, вы должны быть в одном пакете.   -  person mre    schedule 19.06.2011
comment
Да, похоже, ваша проблема в размахе.   -  person dseibert    schedule 19.06.2011


Ответы (2)


Прочтите руководство Управление доступом к членам класса. Вы обнаружите, что вам нужно либо использовать модификатор public, либо знать, что, поскольку модификатор отсутствует (по умолчанию, также известный как package-private), он виден только внутри своего собственного пакета.

person mre    schedule 19.06.2011
comment
Как только вы это сказали, всплыл давно утерянный фрагмент памяти о Java, в котором говорилось: «И вы сказали, что всегда будете помнить меня!» Всем огромное спасибо. - person Gregg Williams; 20.06.2011
comment
@Gregg Williams Вы должны отметить это как правильный, если это лучший ответ. - person semperos; 21.06.2011

public class MainFrame extends JFrame implements WindowListener,
50                  TreeSelectionListener {
51          JPanel panel;
52          InfocardWindow infoWindow;
53          InfocardBuilder infocardBuilder;
54          Main infomlFile;
55          static NotecardModel setupModel;
            ...
}

Поле не является общедоступным. Прочтите источник. Вам нужно использовать модификатор public.

person Amir Afghani    schedule 19.06.2011