PS: я уверен, что другие популярные IDE должны иметь аналогичные функции.

ался получить библиотеку org.apache.commons.beanutils для метода / идиомы, чтобы оценить на равенствовсе свойства между двумя экземплярами, то есть универсальный метод equals () для bean-компонентов.
Есть ли простой способ сделать это с помощью этой библиотеки? Или я иду по этому пути неправильно? Благодарю.

 vorburger30 авг. 2016 г., 10:54
библиотека xtendbeans может представлять интерес в этом контексте; видетьполный пример закончен на этом другом вопросе.

Ответы на вопрос(4)

реализация на основе рефлексии будет делать то, что вы хотите. Я просто хотел предупредить вас, что рефлексия довольно дорогая, и такая реализация может быть сравнительно медленной. Если вам просто нужно время от времени сравнивать, у вас все будет хорошо. Однако, если у вас огромные наборы данных и частые проверки на равенство (например, фильтрация больших таблиц), у вас могут возникнуть проблемы.

 Rolf23 янв. 2009 г., 15:00
Хороший вопрос действительно. У jguru есть хорошее сравнение онлайн:jguru.com/faq/view.jsp?EID=246569
Решение Вопроса

EqualsBuilder.reflectionEquals () изОбще-языки, EqualsBuilder имеет набор методов для включения всех полей, всех непереходных полей и всех полей, кроме определенных.

Если все остальное терпит неудачу, код мог бы служить хорошим примером, как реализовать это.

 artbristol08 окт. 2012 г., 12:01
Имейте в виду, что это не рекурсивно - поэтому, если у вас есть вложенные bean-компоненты (то есть свойство bean-компонента - это другой bean-компонент), они должны реализовать равные себе.reflectionEquals просто звонкиequals для каждого свойства оно не отражается в классе.
 Aaron Digulla08 окт. 2012 г., 13:52
@artbristol: +1, но будьте осторожны с рекурсивными равными: вы можете легко попасть в цикл, когда бины образуют циклы.

хотя это и не является прямым ответом на ваш вопрос, но это может быть ответом на вашу проблему (т. Е. Снимите с себя усилия по созданию стандартного кода)пока быть супер быстрым)

Если вы используете Eclipse, следующие шаги автоматически сгенерируют hashCode и будут вам равны:

Source> Generate hashCode и равно ...

а затем выберите поля, это супер эффективно! : D

Приветствия, и я надеюсь, что это помогает тем, кто приходит сюда с целью сократить время написания шаблонов.

PS: я уверен, что другие популярные IDE должны иметь аналогичные функции.

вы можете использовать рефлексию для проверки равенства компонентов. Есть несколько препятствий, о которых вам нужно знать.

Есть правила относительно поведения equals () и hashcode (). Эти правила говорят о симметрии, согласованности и рефлексивности, что может быть трудно сделать, когда ваш метод equals ведет себя динамически на основе другого объекта, который вы передаете.

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

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

Сказав все это, вот некоторые (в старом стиле) методы для получения геттеров, сеттеров и свойств, которые я написал давно:

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

И сеттеры:

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

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

Редактировать: Конечноreflectionbuilder вОтвет Аарона Дигуллы намного лучше, чем моя ручная работа.

 Vladimir Dyuzhev15 июн. 2012 г., 16:13
булевы геттеры называются isFoo (), поэтому в коде потребуется небольшое улучшение в getGetters ()

Ваш ответ на вопрос