我在做一些我认为简单的事情时遇到了一件令人费解的事。我的classpath上有一个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
时没有变化。 (当然,这些都是摇摇欲坠的鸡巫巫绝望之举。)
像'emacs slime clojure无法访问Java类字段错误的Google查询“无法找到静态字段”'没有任何用处 - 大多数都与尝试调用Java类方法(不访问Java类字段)有关。 / p>
为了彻底,我试过了:
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实例,我需要做什么才能访问静态或非静态字段?感谢您提供的任何帮助或提示。
答案 0 :(得分:6)
阅读Controlling Access to Members of a Class教程。你会发现你需要使用public
修饰符,或者要注意,因为没有修饰符(默认的,也称为包私有),它只在它自己的包中可见。
答案 1 :(得分: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。您需要使用公共修饰符。