访问Java类的静态字段时出现问题

Gre*_*ams 3 java static interop field clojure

我在做一些我认为简单的事情时遇到了一件莫名其妙的事情.我的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;
    ...
Run Code Online (Sandbox Code Playgroud)

当我尝试:

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.
Run Code Online (Sandbox Code Playgroud)

错误消息是:

Unable to find static field: setupModel in class org.infoml.infocardOrganizer.MainFrame
  [Thrown class java.lang.Exception]
Run Code Online (Sandbox Code Playgroud)

我尝试切换到一个更简单的问题:访问非静态字段.我在一个内部做了let,以消除从REPL执行此操作可能是问题的根源的可能性:

infwb.cardmaker> (let [mainFr (MainFrame.)]
  (println (.panel mainFr)))
; Evaluation aborted.
Run Code Online (Sandbox Code Playgroud)

错误消息是:

No matching field found: panel for class org.infoml.infocardOrganizer.MainFrame
  [Thrown class java.lang.IllegalArgumentException]
Run Code Online (Sandbox Code Playgroud)

当取代(.panel mainFr)(println (. mainFr panel)在体内时,我得到了相同的结果let.此外,将REPL切换到命名空间时无需更改user.(当然,这些都是摇摇欲坠的鸡巫巫绝望之举.)

谷歌查询像'emacs slime clojure无法访问Java类字段错误"无法找到静态字段"'没有任何用处 - 大多数都与尝试调用Java类方法(不访问Java类字段)有关.

为了彻底,我试过:

user> (let [mainFr (MainFrame.)]
  MainFrame/setupModel)
; Evaluation aborted.
Run Code Online (Sandbox Code Playgroud)

错误消息和以前一样:

Unable to find static field: setupModel in class org.infoml.infocardOrganizer.MainFrame
  [Thrown class java.lang.Exception]
Run Code Online (Sandbox Code Playgroud)

底线:给定一个MainFrame实例,我需要做什么才能访问静态或非静态字段?感谢您提供的任何帮助或提示.

mre*_*mre 6

阅读控制对类成员的访问教程.你会发现你需要使用public修饰符,或者要注意,因为没有修饰符(默认值,也称为包私有),它只在自己的包中可见.