2012-01-12 44 views
0

在程序中,我使用了兩個外部jar庫。 在外部庫X中有一個類調用庫Y中類的方法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 2012-01-12 02:14:13

+0

@Sergio:不客氣。是的,很容易忽略編譯器默默關注的東西 - 隱式擴展轉換,協變返回等等 - 沒有顯式的JVM支持。 – ruakh 2012-01-12 02:21:04

1

的方法X呼籲可以在罐子Y仍然存在,但也許是法簽名已經改變 - 那就是,數量或類型的參數可能已經改變。