Mes réflexions sur la méthode d'égalité (Java)

Je l'ai fait parce que je voulais comparer les beans les uns avec les autres dans JUnit.

/**
 *Méthode d'égalité pratique
 *OK même si la méthode equals n'est pas implémentée.Je vais aussi vérifier le champ super classe.
 * @param a
 * @param b
 * @return
 */
@SuppressWarnings("unchecked")
public static boolean reflectEquals( Object a, Object b ){
        try{
        if (a == b) {
            return true;
        }
        if (a == null || b == null ) {
            return a == b;
        }
        if (a.getClass() != b.getClass()) {
            return false;
        }
        boolean useBuildinEqualsFlg = a.getClass().getName().startsWith("java.lang");
        if( useBuildinEqualsFlg ){
            try{
                Method equalsMethod = a.getClass().getDeclaredMethod("equals", Object.class);
                boolean eqFlg = Boolean.class.cast( equalsMethod.invoke(a, b) );
                return eqFlg;
            }catch( NoSuchMethodException e ) {
                String aStr = a.toString();
                String bStr = b.toString();
                boolean eqFlg = aStr.equals(bStr);
                return eqFlg;
            }
        }else{
            if( a instanceof List ) {
                a = ((List<Object>) a).toArray();
                b = ((List<Object>) b).toArray();
            }
            if( a.getClass().isArray() ) {
                int aLen = Array.getLength(a);
                int bLen = Array.getLength(b);
                if( aLen != bLen ) {
                    return false;
                }
                for( int i = 0;i<aLen;i++) {
                    Object aElement= Array.get(a, i);
                    Object bElement= Array.get(b, i);
                    if( !reflectEquals( aElement, bElement ) ) {
                        return false;
                    }
                }
                return true;
            }
            List<Field> fields = getAllFields(a.getClass());
            for( Field field : fields ) {
                field.setAccessible(true);
                Object aFieldObj = field.get(a);
                Object bFieldObj = field.get(b);
                boolean eqFlg = reflectEquals( aFieldObj, bFieldObj);
                if( !eqFlg ) {
                    return false;
                }
            }
            return true;
        }
    }catch(IllegalAccessException | IllegalArgumentException | SecurityException | InvocationTargetException e ){
        throw new RuntimeException(e);
    }
}

/**
 *La super classe revient également et obtient tous les champs
 * @param clazz
 * @return
 */
private static List<Field> getAllFields(Class<?> clazz){
	List<Field> allFields = new ArrayList<>();
	if( clazz != Object.class ) {
		Field[] fields = clazz.getDeclaredFields();
		allFields.addAll( Arrays.asList(fields) );
		allFields.addAll( getAllFields(clazz.getSuperclass()) );
	}
	return allFields;
}

↓ Appelez comme ça.

reflectEquals(obj1, obj2)

Après avoir réalisé un chef-d'œuvre, j'ai réalisé que c'était tout ce que j'avais à faire ...

Gson gson = new GsonBuilder().setPrettyPrinting().create();
gson.toJson(obj1).equals( gson.toJson(obj2) );

Recommended Posts

Mes réflexions sur la méthode d'égalité (Java)
Mes pensées sur l'avenir [Préparation]
Mes pensées sur l'avenir [Version de l'application Gradle ①]
[Java Silver] À propos de la méthode equals
Othello de mes pensées [Routine de réflexion 2]
Comparaison Java à l'aide de la méthode compareTo ()
[Java débutant] == opérateur et méthode equals
Considération sur le framework de persistance Java 2017 (1)
Othello de mes pensées [Routine de réflexion 1]
Appelez la super méthode en Java
Méthode Java
java (méthode)
Méthode Java
[Java] méthode
[Java] méthode
[Java] Résumez comment comparer avec la méthode equals
Kick ShellScript sur le serveur depuis Java
Installez OpenJDK (Java) sur le dernier Ubuntu
[Java] Comment utiliser la méthode toString ()
Quelle est la méthode principale en Java?
Retour sur les bases de Java
Exécutez le code Java stocké dans le presse-papiers.
J'ai approfondi ma compréhension de la méthode de fusion
Réflexions sur les interviews Java que vous ne saviez jamais
[Java] Gestion des Java Beans dans la chaîne de méthodes
J'ai essayé de mettre facilement Java sur mon Mac
Sortez avec un suffixe sur la méthode
L'ordre des modificateurs de méthode Java est fixe
Mon DOM (Java)
Référence de la méthode Java8
À propos de la méthode
[Java] méthode forEach
Sortez avec un suffixe sur la méthode 2
Comment utiliser la méthode replace () (Java Silver)
[Java] Est-il inutile de vérifier "l'identité" dans l'implémentation de la méthode equals ()?
Compilez et exécutez Java sur la ligne de commande
Mon StAX (Java)
référence de la méthode java8
[Java] Méthode aléatoire
[Java] Mémo sur la façon d'écrire la source
Ma référence Java
[Java] méthode de fractionnement
La comparaison d'énumération est ==, et equals est bonne [Java]
Déployer des applications Java sur le service IBM Cloud Kubernetes
Sortie sur la méthode, partie 2
Mon modèle DAO (Java)
Méthode de connexion JAVA DB
Installez Java sur Mac
Java Learning 2 (Apprenez la méthode de calcul)
Mémo d'apprentissage Java (méthode)
À propos de la liaison de méthode Java
Exécutez PostgreSQL sur Java
A propos des méthodes de fractionnement (Java)
Etudier Java 8 (voir méthode)
À propos de la méthode de longueur
Programmation Java (méthode de classe)
Ma note d'étude (Java)