在程序中,我使用了兩個外部jar庫。 在外部庫X
中有一個類調用庫Y
中類的方法m
。庫X
使用庫Y
的版本1.0編譯。但是,因爲我在我的代碼中使用庫Y
用於其他目的,所以我更願意使用它的最新版本(比如說5.0)。 我的問題是,當我執行代碼時,庫X
抱怨方法m
不存在了(拋出NoSuchMethod錯誤)。但是,該方法在那裏。NoSuchMethod錯誤嘗試使用更高版本的JAR文件
這個問題可能與我使用的庫的更新版本Y
比編譯時出現的版本有關。 (儘管向後兼容,具有不同的字節碼?)。如果是這種情況,那麼我會有點困惑,因爲我認爲java方法調用在字節碼中表示爲符號引用(例如方法簽名),而不是作爲直接引用(例如偏移),但我可能會誤解一些東西。
感謝您的任何澄清!
確實。簽名以非常微妙的方式發生了變化。原始版本中的方法有一個'int'作爲參數,而在新版本中是'long'。我沒有意識到,我只是在驗證「兼容」方法仍然存在,而不是「確切」的方法仍然存在。謝謝。 – Sergio 2012-01-12 02:14:13
@Sergio:不客氣。是的,很容易忽略編譯器默默關注的東西 - 隱式擴展轉換,協變返回等等 - 沒有顯式的JVM支持。 – ruakh 2012-01-12 02:21:04