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

时间:2011-06-19 19:22:24

标签: java static interop clojure field

我在做一些我认为简单的事情时遇到了一件令人费解的事。我的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实例,我需要做什么才能访问静态或非静态字段?感谢您提供的任何帮助或提示。

2 个答案:

答案 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。您需要使用公共修饰符。