1e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson/* 2e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * Copyright (C) 2010 The Android Open Source Project 3e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * 4e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * you may not use this file except in compliance with the License. 6e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * You may obtain a copy of the License at 7e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * 8e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * 10e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * Unless required by applicable law or agreed to in writing, software 11e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * See the License for the specific language governing permissions and 14e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * limitations under the License. 15e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson */ 16e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson 176186821cb13f4ac7ff50950c813394367e021eaeJesse Wilsonpackage libcore.util; 18e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson 1966e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughesimport java.lang.reflect.Field; 2066e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughesimport java.lang.reflect.Modifier; 2166e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughesimport java.util.Arrays; 2266e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes 23e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilsonpublic final class Objects { 24e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson private Objects() {} 25e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson 26e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson /** 27e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson * Returns true if two possibly-null objects are equal. 28e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson */ 29e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson public static boolean equal(Object a, Object b) { 30e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson return a == b || (a != null && a.equals(b)); 31e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson } 32d7fd1b88b89ca762afe5609d84a8eedfb611cbe1Brian Carlstrom 33d7fd1b88b89ca762afe5609d84a8eedfb611cbe1Brian Carlstrom public static int hashCode(Object o) { 34d7fd1b88b89ca762afe5609d84a8eedfb611cbe1Brian Carlstrom return (o == null) ? 0 : o.hashCode(); 35d7fd1b88b89ca762afe5609d84a8eedfb611cbe1Brian Carlstrom } 3666e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes 3766e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes /** 3866e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes * Returns a string reporting the value of each declared field, via reflection. 3966e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes * Static and transient fields are automatically skipped. Produces output like 4066e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes * "SimpleClassName[integer=1234,string="hello",character='c',intArray=[1,2,3]]". 4166e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes */ 4266e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes public static String toString(Object o) { 4366e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes Class<?> c = o.getClass(); 4466e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes StringBuilder sb = new StringBuilder(); 4566e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes sb.append(c.getSimpleName()).append('['); 4666e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes int i = 0; 4766e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes for (Field f : c.getDeclaredFields()) { 4866e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes if ((f.getModifiers() & (Modifier.STATIC | Modifier.TRANSIENT)) != 0) { 4966e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes continue; 5066e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } 5166e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes f.setAccessible(true); 5266e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes try { 5366e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes Object value = f.get(o); 5466e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes 5566e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes if (i++ > 0) { 5666e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes sb.append(','); 5766e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } 5866e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes 5966e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes sb.append(f.getName()); 6066e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes sb.append('='); 6166e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes 6266e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes if (value.getClass().isArray()) { 6366e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes if (value.getClass() == boolean[].class) { 6466e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes sb.append(Arrays.toString((boolean[]) value)); 6566e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } else if (value.getClass() == byte[].class) { 6666e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes sb.append(Arrays.toString((byte[]) value)); 6766e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } else if (value.getClass() == char[].class) { 6866e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes sb.append(Arrays.toString((char[]) value)); 6966e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } else if (value.getClass() == double[].class) { 7066e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes sb.append(Arrays.toString((double[]) value)); 7166e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } else if (value.getClass() == float[].class) { 7266e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes sb.append(Arrays.toString((float[]) value)); 7366e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } else if (value.getClass() == int[].class) { 7466e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes sb.append(Arrays.toString((int[]) value)); 7566e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } else if (value.getClass() == long[].class) { 7666e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes sb.append(Arrays.toString((long[]) value)); 7766e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } else if (value.getClass() == short[].class) { 7866e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes sb.append(Arrays.toString((short[]) value)); 7966e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } else { 8066e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes sb.append(Arrays.toString((Object[]) value)); 8166e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } 8266e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } else if (value.getClass() == Character.class) { 8366e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes sb.append('\'').append(value).append('\''); 8466e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } else if (value.getClass() == String.class) { 8566e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes sb.append('"').append(value).append('"'); 8666e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } else { 8766e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes sb.append(value); 8866e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } 8966e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } catch (IllegalAccessException unexpected) { 9066e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes throw new AssertionError(unexpected); 9166e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } 9266e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } 9366e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes sb.append("]"); 9466e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes return sb.toString(); 9566e8297c70daaf001ca199e4e4ad3ba5283396d2Elliott Hughes } 96e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson} 97