Java equals()中的getClass()为我的实体提供了意外的结果
我有一个分离两个对象的方法。Java equals()中的getClass()为我的实体提供了意外的结果,java,hibernate,spring-data-jpa,Java,Hibernate,Spring Data Jpa,我有一个分离两个对象的方法。 在方法开始时,我从DB(SpringData JPA/HIBERNATE)检索两个对象,即我们称为类型A的object1和类型B的object2,然后比较object1.getB().equals(object2),尽管object1.getB与object2相同,但结果是false。为什么?如果调试该方法,我可以看到object2和object2的属性B具有相同的类,即B_$$\u jvst1a4_5。为什么有这个奇怪的名字?不应该只有B吗?在等于方法中,比较时生
在方法开始时,我从DB(SpringData JPA/HIBERNATE)检索两个对象,即我们称为类型A的object1和类型B的object2,然后比较
object1.getB().equals(object2)
,尽管object1.getB
与object2
相同,但结果是false
。为什么?如果调试该方法,我可以看到object2和object2的属性B具有相同的类,即B_$$\u jvst1a4_5
。为什么有这个奇怪的名字?不应该只有B吗?在等于方法中,比较时生效
if (getClass() != obj.getClass())
return false;
我获得B!=B_$$\u jvst1a4_5
,因此返回false
有人能给我解释一下这种行为吗?您使用在运行时生成类的库(代理类)。
您永远不应该依赖这些代理类的getClass()
来比较两个实例的类,因为您无法掌握和保证Hibernate(此处)和Spring(使用时)如何生成它们。
作为equals()
的替代方法,您应该使用instanceof
操作符来确定对象是否是编译时已知的类的实例:
if (myObject instanceof MyClass){
...
}
无论如何,instanceof
在equals()
实现中应该始终受到青睐,以免破坏子类实例的方法行为