001package gudusoft.gsqlparser.dlineage.util; 002 003import java.lang.reflect.Field; 004import java.lang.reflect.Modifier; 005import java.util.Arrays; 006 007 008public final class Objects { 009 010 private Objects() { 011 } 012 013 public static boolean equal(Object a, Object b) { 014 return a == b || (a != null && a.equals(b)); 015 } 016 017 public static int hashCode(Object o) { 018 return o == null ? 0 : o.hashCode(); 019 } 020 021 public static String toString(Object o) { 022 Class<?> clazz = o.getClass(); 023 StringBuilder out = new StringBuilder(); 024 out.append(clazz.getSimpleName()).append('['); 025 int index = 0; 026 for (Field field : clazz.getDeclaredFields()) { 027 if (isIgnored(field)) { 028 continue; 029 } 030 field.setAccessible(true); 031 try { 032 Object val = field.get(o); 033 if (index++ > 0) { 034 out.append(','); 035 } 036 out.append(field.getName()).append('='); 037 appendFormattedValue(out, val); 038 } catch (IllegalAccessException e) { 039 throw new AssertionError(e); 040 } 041 } 042 out.append(']'); 043 return out.toString(); 044 } 045 046 private static boolean isIgnored(Field field) { 047 int mods = field.getModifiers(); 048 return (mods & (Modifier.STATIC | Modifier.TRANSIENT)) != 0; 049 } 050 051 private static void appendFormattedValue(StringBuilder sb, Object val) { 052 Class<?> type = val.getClass(); 053 if (type.isArray()) { 054 if (type == boolean[].class) sb.append(Arrays.toString((boolean[]) val)); 055 else if (type == byte[].class) sb.append(Arrays.toString((byte[]) val)); 056 else if (type == char[].class) sb.append(Arrays.toString((char[]) val)); 057 else if (type == double[].class) sb.append(Arrays.toString((double[]) val)); 058 else if (type == float[].class) sb.append(Arrays.toString((float[]) val)); 059 else if (type == int[].class) sb.append(Arrays.toString((int[]) val)); 060 else if (type == long[].class) sb.append(Arrays.toString((long[]) val)); 061 else if (type == short[].class) sb.append(Arrays.toString((short[]) val)); 062 else sb.append(Arrays.toString((Object[]) val)); 063 } else if (type == Character.class) { 064 sb.append('\'').append(val).append('\''); 065 } else if (type == String.class) { 066 sb.append('"').append(val).append('"'); 067 } else { 068 sb.append(val); 069 } 070 } 071}