2011-06-19 5 views
3

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

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

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, чтобы исключить возможность того, что делает это из РЕПЛ может быть источником проблемы:

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, что мне нужно сделать, чтобы доступ к статическому или нестатическому полю? Спасибо за любую помощь или подсказки, которые вы можете предоставить.

+2

Вам не хватает модификатора 'public'? на данный момент, чтобы получить доступ к 'setupModel', вам нужно быть в одном пакете. – mre

+0

Да, ваша проблема кажется областью. – dseibert

ответ

6

Прочитать Controlling Access to Members of a Class учебник. Вы обнаружите, что вам нужно либо использовать модификатор public, либо знать, что, поскольку нет модификатора (по умолчанию, также известного как private-package), он отображается только в пределах его собственного пакета.

+1

Как только вы это сказали, фрагмент фрагмента памяти о Java всплыл и сказал: «И вы сказали, что всегда помните меня!» Огромное спасибо всем. –

+0

@Gregg Williams Вы должны отметить это как правильно, если это лучший ответ. – semperos

2
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; 
      ... 
} 

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

Смежные вопросы