2012-01-12 6 views
0

プログラムで2つの外部jarライブラリを使用しています。 外部ライブラリXにあるクラスが、というクラスのメソッドmを呼び出しています。ライブラリXは、ライブラリYのバージョン1.0でコンパイルされました。しかし、私のコードではライブラリYを他の目的のために使用しているので、私はその最後のバージョン(5.0としましょう)を使用することをお勧めしました。 私の問題は、コードを実行すると、ライブラリXは、メソッドmがもう存在しない(NoSuchMethodエラーをスローする)ことに文句を言います。しかし、その方法はそこにあります。NoSuchMethodエラーが、それ以降のバージョンのJARファイルを使用しようとしています

問題は、コンパイル時に存在していたより新しいバージョンのライブラリYを使用しているという事実に関連している可能性がありますか? (下位互換性はありますが、別のバイトコードとは互換性があります)。もしそうなら、私はJavaメソッド呼び出しが直接参照(例:オフセット)ではなくシンボリックリファレンス(例えばメソッドシグネチャ)としてバイトコードで表現されていると思ってから少し混乱しますが、私は誤解を招く可能性があります何か。

ありがとうございます。

答えて

3

[...]私は

[...] Javaのメソッド呼び出しは、バイトコードとしてシンボリック参照(たとえば、メソッドのシグネチャ)ではなく、直接参照(例えば、オフセット)として表したと思いました

あなたは正しく考えました。 Y v5.0のメソッドは、同じ名前を持っていても、Y v1.0のメソッドとは異なる署名を持つ可能性があります。たとえば、引数の数や引数の種類が異なる場合や、staticまたはstaticになっている可能性があります。

+0

署名は非常に微妙に変化しました。元のバージョンのメソッドはパラメータとして 'int'を持ち、新しいバージョンでは 'long'です。私は「適合する」方法がまだ存在していることを確認しているに過ぎず、「正確な」方法はまだ存在していないことを認識していませんでした。ありがとう。 – Sergio

+0

@Sergio:ようこそ。コンパイラが静かに処理するもの、つまり明示的なJVMサポートなしで暗黙的な変換、共変リターンなどを見落とすのは簡単です。 – ruakh

1

方法XまだジャーYで存在し得るが、おそらく方法署名が変更された呼び出してこと名 - つまり、数または引数の型が変更されていてもよいです。

関連する問題