0

次のような状況があります。

同じワークスペース内の 2 つの Eclipse プロジェクト、Apa と Bepa (簡潔にするために仮名)。

プロジェクト Apa は、プロジェクト Bepa を参照 (インクルード) します。

Bepa にパブリック メソッド b() を持つクラス X があります。プロジェクト Bepa では、Xb() を直接呼び出すと問題なく動作します。

ただし、Apa で X のインスタンスへの参照を作成し、この参照に対して b() を呼び出すと、次のようになります。

Exception in thread "main" java.lang.IllegalAccessError: tried to access method java_cup.runtime.Symbol.<init>(II)V from class de.uni_freiburg.informatik.ultimate.smtinterpol.util.MySymbolFactory$LineColumnSymbol
at de.uni_freiburg.informatik.ultimate.smtinterpol.util.MySymbolFactory$LineColumnSymbol.<init>(MySymbolFactory.java:31)
at de.uni_freiburg.informatik.ultimate.smtinterpol.util.MySymbolFactory.startSymbol(MySymbolFactory.java:95)
at java_cup.runtime.LRParser.parse(LRParser.java:393)
at de.uni_freiburg.informatik.ultimate.smtinterpol.smtlib2.ParseEnvironment.parseStream(ParseEnvironment.java:152)
at de.uni_freiburg.informatik.ultimate.smtinterpol.smtlib2.ParseEnvironment.parseScript(ParseEnvironment.java:118)
at de.uni_freiburg.informatik.ultimate.smtinterpol.smtlib2.SMTLIB2Parser.run(SMTLIB2Parser.java:47)
at de.uni_freiburg.informatik.ultimate.smtinterpol.Main.main(Main.java:121)
at de.uka.ilkd.key.keynterpol.KeYnterpolInterface.main(KeYnterpolInterface.java:36)

私が理解していることから、犯人はBが参照するサードパーティのjarです。しかし、私は一生、ApaではなくBepa内からしか使用できない理由を理解できません。どんな助けでも大歓迎です。

4

1 に答える 1

2

IllegalAccessError はIncompatibleClassChangeErrorのサブクラスです。コードの実行中に IncompatibleClassChangeError がスローされた場合、これは通常、コードがコンパイルされたのと同じクラスで実行されていないことを示しています。

あなたの場合、 IllegalAccessError がスローされる原因となっているメソッドは、デフォルトの可視性を持つクラスのコンストラクターです。java_cup.runtime.Symbol

    Symbol(int sym_num, int state)
    {
        sym = sym_num;
        parse_state = state;
    }

このコンストラクターを呼び出すコードは別のパッケージにあるため、このコンストラクターを直接呼び出すことはできません。別のパッケージからパッケージ プライベート メンバーにアクセスしようとするとコンパイラ エラーが発生するため、通常、このようなエラーはコンパイラによってキャッチされます。ただし、あなたの場合、そのようなコンパイラ エラーはないようです。

java_cup.*コンパイルに使用したのと同じクラスパスでコードを実行している場合、上記のコンストラクターの可視性が異なり、クラスがクラスパスに複数回出現すると推測できます。コンパイラーはSymbol、このコンストラクターが public であるクラスのコピーを 1 つ見つけたに違いなく、JVM は、このコンストラクターが package-private であるコピーを見つけたに違いありません。

于 2013-01-19T14:01:56.423 に答える