Проблема доступа к статическому полю класса Java - PullRequest
3 голосов
/ 19 июня 2011

Мне необъяснимо тяжело делать что-то, что я считал самой простотой. У меня есть файл 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« Unable to find static field »» »не дают ничего полезного - большинство из них связано с попыткой вызова методов класса 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, что мне нужно сделать, чтобы получить доступ к статическому или нестатическому полю? Спасибо за любую помощь или советы, которые вы можете предоставить.

Ответы [ 2 ]

6 голосов
/ 19 июня 2011

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

2 голосов
/ 19 июня 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;
            ...
}

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

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