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

标签 java

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

我在做什么。

我有一个 CurrentUser 对象,在登录时将其存储在用户 session 中。我使用 currentUser 与表单的 signedUser 进行比较。如果 currentUser.equals(pr.getAssignedUser()) 则我启用访问。 AssignedUser 是对 CurrentUser 的 Hibernate 变量引用。如果我从 equals 覆盖中删除 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");
        }
    }
}

最佳答案

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

这个答案有一个替代解决方案:https://stackoverflow.com/a/1139992/342852

关于java - 什么会导致 getClass() != obj.getClass() 在相​​同对象上不相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20802158/

相关文章:

java - 在多线程情况下使用单例类并保证线程安全! (最佳实践和最佳性能)

java - 如何使用java中的 map 列出具有特定主题的每条消息?

java - 为什么当尝试传递两个相同的整数数组时 contains 方法返回 false

java - 如何指定 Maven 目标的参数值

java - 应用程序运行时每秒更新一次 TextView

java - 程序将 *.csv 文件读取到数组中并打印内容。需要打印索引号

java - Spring REST Hibernate 应用设计

java - VSCode 的 Google Styleguide Java 格式

java - 在 Kotlin 中将字符串编码为 UTF-8

java - JavaEE 中的 'Facet' 是什么?