Как в целом сравнить целые java beans?

Чтобы напрямую ответить на bean ваш вопрос, вы можете использовать jre отражение для проверки равенства beans bean-компонентов. Есть несколько beans препятствий, о которых следует j2se помнить.

Существуют правила openjdk поведения equals() и hashcode(). Эти .java правила говорят о симметрии, согласованности beans и рефлексивности, что может oraclejdk быть трудно сделать, когда java-api ваш метод equals ведет себя beans динамически в зависимости java-libraries от другого объекта, который jre вы передаете.

Интересное чтение: http://www.geocities.com/technofundo/tech/java/equalhash.html

В javabeans общем, я думаю, вам лучше beans создать свой собственный java хэш-код и методы equals. Есть oraclejdk несколько хороших плагинов, которые java-libraries могут автоматически генерировать .java этот код на основе свойств oraclejdk класса.

Сказав все это, вот java-se несколько (старого стиля) методов jdk для получения геттеров, сеттеров oraclejdk и свойств, которые я написал core-java много лет назад:

private Map getPrivateFields(Class clazz, Map getters, Map setters) {
    Field[] fields = clazz.getDeclaredFields();
    Map m = new HashMap();
    for (int i = 0; i < fields.length; i++) {
        int modifiers = fields[i].getModifiers();
        if (Modifier.isPrivate(modifiers) && !Modifier.isStatic(modifiers) && !Modifier.isFinal(modifiers)) {
            String propName = fields[i].getName();
            if (getters.get(propName) != null && setters.get(propName) != null) {
                m.put(fields[i].getName(), fields[i]);
            }
        }
    }
    return m;
}

Получатели:

private Map getGetters(Class clazz) {
    Method[] methods = clazz.getMethods();
    Map m = new HashMap();
    for (int i = 0; i < methods.length; i++) {
        if (methods[i].getName().startsWith("get")) {
            int modifiers = methods[i].getModifiers();
            if (validAccessMethod(modifiers)) {
                m.put(getPropertyName(methods[i].getName()), methods[i]);
            }
        }
    }
    return m;
}

И jre сеттеры:

private Map getSetters(Class clazz, Map getters) {
    Method[] methods = clazz.getMethods();
    Map m = new HashMap();
    for (int i = 0; i < methods.length; i++) {
        if (methods[i].getName().startsWith("set")) {
            int modifiers = methods[i].getModifiers();
            String propName = getPropertyName(methods[i].getName());
            Method getter = (Method) getters.get(propName);

            if (validAccessMethod(modifiers) && getter != null) {
                Class returnType = getter.getReturnType();
                Class setType = methods[i].getParameterTypes()[0];
                int numTypes = methods[i].getParameterTypes().length;

                if (returnType.equals(setType) && numTypes == 1) {
                    m.put(propName, methods[i]);
                }
            }
        }
    }
    return m;
}

Может быть, ты сможешь oraclejdk использовать это, чтобы свернуть core-java свой собственный.

Изменить: Конечно, reflectionbuilder в j2se Aaron Digulla's answer намного лучше, чем моя ручная java работа.

java

javabeans

2022-09-05T04:30:32+00:00