Ich habe es geschafft, weil ich Bohnen in JUnit miteinander vergleichen wollte.
Es wurde ein Fehler behoben, durch den eine Endlosschleife auftrat, wenn die Methode equals damit implementiert wurde.
Beim Werfen ist der Anrufer Mendokusai, daher habe ich ihn so geändert, dass er intern abfängt.
Für Klassen unter java.lang ⇒ Rufen Sie die native equals-Methode auf. Vergleiche mit Strings, wenn die Methode equals nicht implementiert ist
Wenn es sich nicht unter java.lang befindet und es sich um ein Array handelt ⇒ Überprüfen Sie die Länge und jedes Element
Wenn es sich nicht unter java.lang befindet und kein Array ist ⇒ Überprüfen Sie den Feldwert
/**
*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