Java 什么会导致getClass()!=obj.getClass()在相同对象上不相等
我试着比较两个相同的物体。当页面第一次加载时,它们是相等的,但是当我第二次刷新页面时,尽管数据或对象没有改变,但它们彼此不相等 我在做什么 我有一个Java 什么会导致getClass()!=obj.getClass()在相同对象上不相等,java,Java,我试着比较两个相同的物体。当页面第一次加载时,它们是相等的,但是当我第二次刷新页面时,尽管数据或对象没有改变,但它们彼此不相等 我在做什么 我有一个CurrentUserobj,在登录时存储在用户会话中。我使用currentUser与表单的assignedUser进行比较。如果currentUser.equals(pr.getAssignedUser())则启用访问AssignedUser是对CurrentUser的hibernate变量引用。如果我删除getClass()!=从我的equals
CurrentUser
obj,在登录时存储在用户会话中。我使用currentUser
与表单的assignedUser
进行比较。如果currentUser.equals(pr.getAssignedUser())
则启用访问AssignedUser
是对CurrentUser
的hibernate变量引用。如果我删除getClass()!=从我的equals覆盖和使用属性比较中,getClass
,一切正常
最让我担心的是,它在第一次访问时起作用,但在页面刷新时不起作用。在不知道发生了什么的情况下,我担心内存泄漏
有人知道这里发生了什么吗
CurrentUserServiceImpl.class
@Scope(ScopeConstants.PERTHREAD)
public class CurrentUserServiceImpl implements CurrentUserServiceService {
private final CrudDAO crudDAO;
private CurrentUser currentUser;
public CurrentUserServiceImpl(CrudDAO crudDAO) {
this.crudDAO = crudDAO;
}
public Long getUserId() {
return getUser().getId();
}
public CurrentUser getCurrentUser() {
if (this.isUserExist() && applicationUser == null) {
PersonProfile personProfile = (PersonProfile) SecurityUtils.getSubject().getPrincipal();
currentUser = crudDAO.find(personProfile.getUid());
}
return currentUser;
}
public boolean isUserExist() {
return SecurityUtils.getSubject().getPrincipal() != null;
}
}
public PurchaseRequisition {
@Inject
private CurrentUserService currentUserService;
@Inject
private CrudDAO crudDAO;
void setupRender() {
CurrentUser currentUser = currentUserService.getCurrentUser();
PurchaseReq pr = crudDAO.find(PurchaseReq.class, id);
if(currentUser.equals(pr.getAssignedUser()) {
System.out.println("equal");
}
}
}
purchaserequision.class
@Scope(ScopeConstants.PERTHREAD)
public class CurrentUserServiceImpl implements CurrentUserServiceService {
private final CrudDAO crudDAO;
private CurrentUser currentUser;
public CurrentUserServiceImpl(CrudDAO crudDAO) {
this.crudDAO = crudDAO;
}
public Long getUserId() {
return getUser().getId();
}
public CurrentUser getCurrentUser() {
if (this.isUserExist() && applicationUser == null) {
PersonProfile personProfile = (PersonProfile) SecurityUtils.getSubject().getPrincipal();
currentUser = crudDAO.find(personProfile.getUid());
}
return currentUser;
}
public boolean isUserExist() {
return SecurityUtils.getSubject().getPrincipal() != null;
}
}
public PurchaseRequisition {
@Inject
private CurrentUserService currentUserService;
@Inject
private CrudDAO crudDAO;
void setupRender() {
CurrentUser currentUser = currentUserService.getCurrentUser();
PurchaseReq pr = crudDAO.find(PurchaseReq.class, id);
if(currentUser.equals(pr.getAssignedUser()) {
System.out.println("equal");
}
}
}
仅当使用不同的类加载器加载对象类时,才可以:
class TestClassLoader extends URLClassLoader {
...
class Test1 {
public static void main(String[] args) throws Exception {
Object obj1 = new TestClassLoader().loadClass("test.Test1").newInstance();
Object obj2 = new TestClassLoader().loadClass("test.Test1").newInstance();
System.out.println(obj1.getClass() == obj2.getClass());
}
}
这将打印false
但是如果
obj1==obj2
,那么obj1.getClass()==obj2.getClass()
总是这样。Hibernate使用CGLib或javassist创建代理类。因此,getClass()
无法工作。请改用instanceof
这个答案有另一个解决方案:多类加载器。由于这里提供的信息很少,几乎不可能理解这一点。一个可能是另一个的子类。谁创造了它们?你把它们打印出来了吗?打印出类名了吗?试着调试一下,看看对
getClass()
的两个调用都返回了什么。Hibernate通常会创建代理对象,也就是说,它会动态地生成实体的子类,因此对Hibernate对象的getClass()
调用可能会返回Hibernate生成的类的名称。您能解释一下这意味着什么吗?啊,您认为我在以某种方式创建该类的新实例吗?顺便说一句,我在上面提供了更多的代码。我有点困惑,我应该在我的hash equals中做类似的事情吗?Hibernate.getClass()!=obj.getClass()@George正如我所说,我会使用instanceof
而不是getClass()。这个问题更深入地讨论了这个主题: