2011-04-07 40 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

相关问题