Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么会导致getClass()!=obj.getClass()在相同对象上不相等_Java - Fatal编程技术网

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()。这个问题更深入地讨论了这个主题: