2011-04-07 36 views
1

我剛剛升級了一個庫,而另一個開始投擲NoSuchFieldError。如果這個領域被刪除了,那很好。但它仍然存在。它只是被棄用。NoSuchFieldError但字段有

Hibernate.TIMESTAMP.nullSafeGet(null, null); // << works 

new PersistentDateTime().nullSafeGet(null, null); // << throws NoSuchFieldError 

其中所述nullSafeGet方法具有:

Hibernate.TIMESTAMP.nullSafeGet(resultSet, string); 

(當然,未發現該字段是TIMESTAMP

庫的正確版本是在類路徑(otherewise我的手動測試不會有效)

爲什麼會這樣呢?

更新:我創建了一個新類,覆蓋舊的類,並使用完全相同的代碼定義相同的方法,現在它可以工作。任何想法在字節碼中應該發生什麼?

回答

3

Joshua Bloch在他的short presentation中解釋了這一點 - static final字段被複制到客戶端庫中,因此應該在常量更改時重新編譯它。

+0

重新打開此討論的道歉,但我很好奇 - 這將如何導致NoSuchFieldError?我期望一個程序使用庫中定義的靜態最終變量來使用舊值,而不是訪問它時的新值。 – 2014-09-16 04:18:51

1

我能想到的唯一的事情是PersistentDateTime()返回一個針對不同版本的Hibernate編譯的某個類的實例。

+0

這是肯定的。但是由於該領域存在,應該找到它,不是嗎? – Bozho 2011-04-07 19:44:43

+0

如果每個庫都必須在另一個庫中進行非結構性更改後重新編譯,它們不能互操作 – Bozho 2011-04-07 19:57:29

+0

Right Bozho,但TIMESTAMP是常量,常量由編譯器內聯,而TIMESTAMP爲org.hibernate.type.TimestampType。實例。如果這種類型在版本之間改變,則該常量可能不再兼容。 – 2011-04-07 19:59:21

相關問題