什么会导致getClass()!= obj.getClass()在相同的对象上不相等

时间:2013-12-27 14:12:10

标签: java

我正在尝试比较两个相同的对象。当页面首次加载时,它们是相等的,但是当我第二次刷新页面时,尽管数据或对象没有变化,但它们并不相等。

我在做什么。

我有一个CurrentUser obj,我在登录时存储在用户会话中。我使用currentUser与表单的assignedUser进行比较。如果currentUser.equals(pr.getAssignedUser()),那么我启用访问权限。 AssignedUser是对CurrentUser的hibernate变量引用。如果我从我的等于覆盖中删除getClass() != obj.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;
    }
}

PurchaseRequisition.class

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");
        }
    }
}

2 个答案:

答案 0 :(得分:2)

Hibernate使用CGLib或javassist创建代理类。因此getClass()无法正常工作。请改用instanceof

此答案有另一种解决方案:https://stackoverflow.com/a/1139992/342852

答案 1 :(得分:1)

只有当对象类加载了不同的类加载器时才会出现:

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()总是。