/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package libcore.util; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.Arrays; public final class Objects { private Objects() {} /** * Returns true if two possibly-null objects are equal. */ public static boolean equal(Object a, Object b) { return a == b || (a != null && a.equals(b)); } public static int hashCode(Object o) { return (o == null) ? 0 : o.hashCode(); } /** * Returns a string reporting the value of each declared field, via reflection. * Static and transient fields are automatically skipped. Produces output like * "SimpleClassName[integer=1234,string="hello",character='c',intArray=[1,2,3]]". */ public static String toString(Object o) { Class c = o.getClass(); StringBuilder sb = new StringBuilder(); sb.append(c.getSimpleName()).append('['); int i = 0; for (Field f : c.getDeclaredFields()) { if ((f.getModifiers() & (Modifier.STATIC | Modifier.TRANSIENT)) != 0) { continue; } f.setAccessible(true); try { Object value = f.get(o); if (i++ > 0) { sb.append(','); } sb.append(f.getName()); sb.append('='); if (value.getClass().isArray()) { if (value.getClass() == boolean[].class) { sb.append(Arrays.toString((boolean[]) value)); } else if (value.getClass() == byte[].class) { sb.append(Arrays.toString((byte[]) value)); } else if (value.getClass() == char[].class) { sb.append(Arrays.toString((char[]) value)); } else if (value.getClass() == double[].class) { sb.append(Arrays.toString((double[]) value)); } else if (value.getClass() == float[].class) { sb.append(Arrays.toString((float[]) value)); } else if (value.getClass() == int[].class) { sb.append(Arrays.toString((int[]) value)); } else if (value.getClass() == long[].class) { sb.append(Arrays.toString((long[]) value)); } else if (value.getClass() == short[].class) { sb.append(Arrays.toString((short[]) value)); } else { sb.append(Arrays.toString((Object[]) value)); } } else if (value.getClass() == Character.class) { sb.append('\'').append(value).append('\''); } else if (value.getClass() == String.class) { sb.append('"').append(value).append('"'); } else { sb.append(value); } } catch (IllegalAccessException unexpected) { throw new AssertionError(unexpected); } } sb.append("]"); return sb.toString(); } }