2011-06-19 3 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] 

が、私は単純な問題への切り替えを試みた:非アクセスここ

は私のクラスです静的フィールド。

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] 

が、私はときに、同じ結果を得た私は、REPLからこれを行うことは、問題の原因であるかもしれないという可能性を排除するために、 let内部でそれをやりました letの体内に (.panel mainFr)(println (. mainFr panel)を置き換えてください。また、REPLを名前空間 userに切り替えるときに変更はありません。 (許可されている、これらは壊れた鶏のブードゥーード絶望の動きです)

「emacs slime clojureのようなGoogleのクエリは、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] 

ボトムライン:メインフレームのインスタンスを考えると、私はに何をすべきかが必要です静的フィールドまたは非静的フィールドのいずれかにアクセスしますか?何か助けやヒントを提供してくれてありがとう。

+2

あなたは 'public'修飾子を紛失していませんか?現時点では、 'setupModel'にアクセスするためには、同じパッケージに入っている必要があります。 – mre

+0

はい、あなたの問題は有効範囲のようです。 – dseibert

答えて

6

チュートリアルControlling Access to Members of a Classをお読みください。 public修飾子を使用するか、修飾子(デフォルトはpackage-privateとも呼ばれる)がないので、それ自身のパッケージ内でのみ表示されることに注意してください。

+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をお読みください。 public修飾子を使用する必要があります。