Meine Gedanken zur Equals-Methode (Java)

Ich habe es geschafft, weil ich Bohnen in JUnit miteinander vergleichen wollte.

/**
 *Praktisch gleich Methode
 *OK, auch wenn die Methode equals nicht implementiert ist.Ich werde auch das Superklassenfeld überprüfen.
 * @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);
    }
}

/**
 *Super Klasse geht auch zurück und bekommt alle Felder
 * @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;
}

↓ So anrufen.

reflectEquals(obj1, obj2)

Nachdem ich ein Meisterwerk gemacht hatte, wurde mir klar, dass dies alles ist, was ich tun muss ...

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

Recommended Posts

Meine Gedanken zur Equals-Methode (Java)
Meine Gedanken zur Zukunft [Vorbereitung]
Meine Gedanken zur Zukunft [Gradle App Version ①]
[Java Silver] Über gleich Methode
Othello meiner Gedanken [Denkroutine 2]
Java-Vergleich mit der compareTo () -Methode
[Java-Anfänger] == Operator und Gleiche Methode
Überlegungen zum Java Persistence Framework 2017 (1)
Othello meiner Gedanken [Denkroutine 1]
Rufen Sie die Super-Methode in Java auf
Java-Methode
Java (Methode)
Java-Methode
[Java] -Methode
[Java] -Methode
[Java] Fassen Sie zusammen, wie Sie mit der Methode equals vergleichen können
Kick ShellScript auf dem Server von Java
Installieren Sie OpenJDK (Java) auf dem neuesten Ubuntu
[Java] Verwendung der toString () -Methode
Was ist die Hauptmethode in Java?
Rückblick auf die Grundlagen von Java
Führen Sie den in der Zwischenablage gespeicherten Java-Code aus.
Vertiefte mein Verständnis der Zusammenführungsmethode
Gedanken zu Java-Interviews, die Sie nie gekannt haben
[Java] Behandlung von Java Beans in der Methodenkette
Ich habe versucht, Java einfach auf meinen Mac zu bringen
Geben Sie ein Suffix für die Methode an
Die Reihenfolge der Java-Methodenmodifikatoren ist festgelegt
Mein DOM (Java)
Java8-Methodenreferenz
Über die Methode
[Java] forEach-Methode
Geben Sie ein Suffix für Methode 2 heraus
Verwendung der replace () -Methode (Java Silver)
[Java] Ist es nicht erforderlich, "Identität" bei der Implementierung der equals () -Methode zu überprüfen?
Kompilieren Sie Java und führen Sie es in der Befehlszeile aus
Mein StAX (Java)
Java8-Methodenreferenz
[Java] Zufällige Methode
[Java] Memo zum Schreiben der Quelle
Meine Java-Referenz
[Java] Split-Methode
Der Vergleich von enum ist == und gleich ist gut [Java]
Stellen Sie Java-Apps auf dem IBM Cloud Kubernetes-Dienst bereit
Ausgabe über die Methode, Teil 2
Mein DAO-Muster (Java)
JAVA DB-Verbindungsmethode
Installieren Sie Java auf dem Mac
Java Learning 2 (Lernen Sie die Berechnungsmethode)
Java-Lernnotiz (Methode)
Informationen zur Bindung von Java-Methoden
Führen Sie PostgreSQL unter Java aus
Informationen zu Aufteilungsmethoden (Java)
Java 8 studieren (siehe Methode)
Über die Längenmethode
Java-Programmierung (Klassenmethode)
Meine Studiennotiz (Java)