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 private Objects() { 010 } 011 012 /** 013 * Returns true if two possibly-null objects are equal. 014 */ 015 public static boolean equal(Object a, Object b) { 016 return a == b || (a != null && a.equals(b)); 017 } 018 019 public static int hashCode(Object o) { 020 return (o == null) ? 0 : o.hashCode(); 021 } 022 023 /** 024 * Returns a string reporting the value of each declared field, via reflection. 025 * Static and transient fields are automatically skipped. Produces output like 026 * "SimpleClassName[integer=1234,string="hello",character='c',intArray=[1,2,3]]". 027 */ 028 public static String toString(Object o) { 029 Class<?> c = o.getClass(); 030 StringBuilder sb = new StringBuilder(); 031 sb.append(c.getSimpleName()).append('['); 032 int i = 0; 033 for (Field f : c.getDeclaredFields()) { 034 if ((f.getModifiers() & (Modifier.STATIC | Modifier.TRANSIENT)) != 0) { 035 continue; 036 } 037 f.setAccessible(true); 038 try { 039 Object value = f.get(o); 040 if (i++ > 0) { 041 sb.append(','); 042 } 043 sb.append(f.getName()); 044 sb.append('='); 045 if (value.getClass().isArray()) { 046 if (value.getClass() == boolean[].class) { 047 sb.append(Arrays.toString((boolean[]) value)); 048 } else if (value.getClass() == byte[].class) { 049 sb.append(Arrays.toString((byte[]) value)); 050 } else if (value.getClass() == char[].class) { 051 sb.append(Arrays.toString((char[]) value)); 052 } else if (value.getClass() == double[].class) { 053 sb.append(Arrays.toString((double[]) value)); 054 } else if (value.getClass() == float[].class) { 055 sb.append(Arrays.toString((float[]) value)); 056 } else if (value.getClass() == int[].class) { 057 sb.append(Arrays.toString((int[]) value)); 058 } else if (value.getClass() == long[].class) { 059 sb.append(Arrays.toString((long[]) value)); 060 } else if (value.getClass() == short[].class) { 061 sb.append(Arrays.toString((short[]) value)); 062 } else { 063 sb.append(Arrays.toString((Object[]) value)); 064 } 065 } else if (value.getClass() == Character.class) { 066 sb.append('\'').append(value).append('\''); 067 } else if (value.getClass() == String.class) { 068 sb.append('"').append(value).append('"'); 069 } else { 070 sb.append(value); 071 } 072 } catch (IllegalAccessException unexpected) { 073 throw new AssertionError(unexpected); 074 } 075 } 076 sb.append("]"); 077 return sb.toString(); 078 } 079}