objectutility.java

来自「JAVA 所有包」· Java 代码 · 共 705 行 · 第 1/2 页

JAVA
705
字号
		fields = new Field[0]; 	    } else { 		fields = sun.reflect.misc.FieldUtil.getDeclaredFields(cls);             } 	    for (int ctr=0; ctr<fields.length; ctr++ ) {		final Field fld = fields[ctr] ;		int modifiers = fld.getModifiers() ;		// Do not display field if it is static, since these fields		// are always the same for every instances.  This could		// be made configurable, but I don't think it is 		// useful to do so.		if (!Modifier.isStatic( modifiers )) {	            if (security != null) {		        if (!Modifier.isPublic(modifiers))			    continue;		    }		    result.startElement() ;		    result.append( fld.getName() ) ;		    result.append( ":" ) ;		    try {			// Make sure that we can read the field if it is 			// not public			AccessController.doPrivileged( new PrivilegedAction() {			    public Object run() {				fld.setAccessible( true ) ;				return null ;			    } 			} ) ;			java.lang.Object value = fld.get( obj ) ;			objectToStringHelper( printed, result, value ) ;		    } catch (Exception exc2) {			result.append( "???" ) ;		    }		    result.endElement() ;		}	    }	    result.endObject() ;	} catch (Exception exc2) {	    result.endObject( obj.toString() ) ;	}    }    private void handleArray( IdentityHashMap printed, ObjectWriter result,	java.lang.Object obj )     {	Class compClass = obj.getClass().getComponentType() ;	if (compClass == boolean.class) {	    boolean[] arr = (boolean[])obj ;	    for (int ctr=0; ctr<arr.length; ctr++) {		result.startElement() ;		result.append( arr[ctr] ) ;		result.endElement() ;	    }	} else if (compClass == byte.class) {	    byte[] arr = (byte[])obj ;	    for (int ctr=0; ctr<arr.length; ctr++) {		result.startElement() ;		result.append( arr[ctr] ) ;		result.endElement() ;	    }	} else if (compClass == short.class) {	    short[] arr = (short[])obj ;	    for (int ctr=0; ctr<arr.length; ctr++) {		result.startElement() ;		result.append( arr[ctr] ) ;		result.endElement() ;	    }	} else if (compClass == int.class) {	    int[] arr = (int[])obj ;	    for (int ctr=0; ctr<arr.length; ctr++) {		result.startElement() ;		result.append( arr[ctr] ) ;		result.endElement() ;	    }	} else if (compClass == long.class) {	    long[] arr = (long[])obj ;	    for (int ctr=0; ctr<arr.length; ctr++) {		result.startElement() ;		result.append( arr[ctr] ) ;		result.endElement() ;	    }	} else if (compClass == char.class) {	    char[] arr = (char[])obj ;	    for (int ctr=0; ctr<arr.length; ctr++) {		result.startElement() ;		result.append( arr[ctr] ) ;		result.endElement() ;	    }	} else if (compClass == float.class) {	    float[] arr = (float[])obj ;	    for (int ctr=0; ctr<arr.length; ctr++) {		result.startElement() ;		result.append( arr[ctr] ) ;		result.endElement() ;	    }	} else if (compClass == double.class) {	    double[] arr = (double[])obj ;	    for (int ctr=0; ctr<arr.length; ctr++) {		result.startElement() ;		result.append( arr[ctr] ) ;		result.endElement() ;	    }	} else { // array of object	    java.lang.Object[] arr = (java.lang.Object[])obj ;	    for (int ctr=0; ctr<arr.length; ctr++) {		result.startElement() ;		objectToStringHelper( printed, result, arr[ctr] ) ;		result.endElement() ;	    }	}    }    private static class Pair     {	private java.lang.Object obj1 ;	private java.lang.Object obj2 ;	Pair( java.lang.Object obj1, java.lang.Object obj2 )	{	    this.obj1 = obj1 ;	    this.obj2 = obj2 ;	}	public boolean equals( java.lang.Object obj )	{	    if (!(obj instanceof Pair))		return false ;	    Pair other = (Pair)obj ;	    return other.obj1 == obj1 && other.obj2 == obj2 ;	}	public int hashCode()	{	    return System.identityHashCode( obj1 ) ^ 		System.identityHashCode( obj2 ) ;	}    }    private static boolean equalsHelper( Map counterpart, Set considered, 	java.lang.Object obj1, java.lang.Object obj2 )    {	if ((obj1 == null) || (obj2 == null))	    return obj1 == obj2 ;	java.lang.Object other2 = counterpart.get( obj1 ) ;	if (other2 == null) {	    other2 = obj2 ;	    counterpart.put( obj1, other2 ) ;	}	if (obj1 == other2)	    return true ;	if (obj2 != other2)	    return false ;		Pair pair = new Pair( obj1, obj2 ) ;	if (considered.contains( pair ))	    return true ;	else	    considered.add( pair ) ;	if (obj1 instanceof java.lang.Object[] && 	    obj2 instanceof java.lang.Object[])	    return equalArrays( counterpart, considered, 		(java.lang.Object[])obj1, (java.lang.Object[])obj2 ) ;	else if (obj1 instanceof Map && obj2 instanceof Map)	    return equalMaps( counterpart, considered, 		(Map)obj1, (Map)obj2 ) ;	else if (obj1 instanceof Set && obj2 instanceof Set)	    return equalSets( counterpart, considered, 		(Set)obj1, (Set)obj2 ) ;	else if (obj1 instanceof List && obj2 instanceof List)	    return equalLists( counterpart, considered, 		(List)obj1, (List)obj2 ) ;	else if (obj1 instanceof boolean[] && obj2 instanceof boolean[])	    return Arrays.equals( (boolean[])obj1, (boolean[])obj2 ) ;	else if (obj1 instanceof byte[] && obj2 instanceof byte[])	    return Arrays.equals( (byte[])obj1, (byte[])obj2 ) ;	else if (obj1 instanceof char[] && obj2 instanceof char[])	    return Arrays.equals( (char[])obj1, (char[])obj2 ) ;	else if (obj1 instanceof double[] && obj2 instanceof double[])	    return Arrays.equals( (double[])obj1, (double[])obj2 ) ;	else if (obj1 instanceof float[] && obj2 instanceof float[])	    return Arrays.equals( (float[])obj1, (float[])obj2 ) ;	else if (obj1 instanceof int[] && obj2 instanceof int[])	    return Arrays.equals( (int[])obj1, (int[])obj2 ) ;	else if (obj1 instanceof long[] && obj2 instanceof long[])	    return Arrays.equals( (long[])obj1, (long[])obj2 ) ;	else {	    Class cls = obj1.getClass() ;	    if (cls != obj2.getClass())		return obj1.equals( obj2 ) ;	    else		return equalsObject( counterpart, considered, cls, obj1, obj2 ) ;	}    }    private static boolean equalsObject( Map counterpart, Set considered, 	Class cls, java.lang.Object obj1, java.lang.Object obj2 )     {	Class objectClass = java.lang.Object.class ;	if (cls == objectClass)	    return true ;	Class[] equalsTypes = { objectClass } ;	try {	    Method equalsMethod = cls.getDeclaredMethod( "equals", 		equalsTypes ) ;	    return obj1.equals( obj2 ) ;	} catch (Exception exc) {	    if (equalsObjectFields( counterpart, considered, 		    cls, obj1, obj2 ))		return equalsObject( counterpart, considered, 		    cls.getSuperclass(), obj1, obj2 ) ;	    else		return false ;	}    }    private static boolean equalsObjectFields( Map counterpart, Set considered,	Class cls, java.lang.Object obj1, java.lang.Object obj2 )     {	Field[] fields = cls.getDeclaredFields() ;	for (int ctr=0; ctr<fields.length; ctr++) {	    try {		final Field field = fields[ctr] ;		// Ignore static fields		if (!Modifier.isStatic( field.getModifiers())) {		    AccessController.doPrivileged(new PrivilegedAction() {			public Object run() {			    field.setAccessible( true ) ;			    return null ;			} 		    } ) ;		    java.lang.Object value1 = field.get( obj1 ) ;		    java.lang.Object value2 = field.get( obj2 ) ;		    if (!equalsHelper( counterpart, considered, value1, 			value2 ))			return false ;		}	    } catch (IllegalAccessException exc) {		return false ;	    }	}	return true ;    }    private static boolean equalArrays( Map counterpart, Set considered,	java.lang.Object[] arr1, java.lang.Object[] arr2 )     {	int len = arr1.length ;	if (len != arr2.length)	    return false ;	for (int ctr = 0; ctr<len; ctr++ )	    if (!equalsHelper( counterpart, considered, arr1[ctr], arr2[ctr] ))		return false ;	return true ;    }    private static boolean equalMaps( Map counterpart, Set considered,	Map map1, Map map2 )    {	if (map2.size() != map1.size())	    return false;        try {            Iterator i = map1.entrySet().iterator();            while (i.hasNext()) {                Entry e = (Entry) i.next();                java.lang.Object key = e.getKey();                java.lang.Object value = e.getValue();                if (value == null) {                    if (!(map2.get(key)==null && map2.containsKey(key)))                        return false;                } else {                    if (!equalsHelper( counterpart, considered, 			value, map2.get(key)))                        return false;                }            }        } catch(ClassCastException unused)   {            return false;        } catch(NullPointerException unused) {            return false;        }	return true;    }    // Obviously this is an inefficient quadratic algorithm.    // This is taken pretty directly from AbstractSet and AbstractCollection    // in the JDK.    // For HashSet, an O(n) (with a good hash function) algorithm    // is possible, and likewise TreeSet, since it is     // ordered, is O(n).  But this is not worth the effort here.    // Note that the inner loop uses equals, not equalsHelper.    // This is needed because of the searching behavior of this test.    // However, note that this will NOT correctly handle sets that    // contain themselves as members, or that have members that reference    // themselves.  These cases will cause infinite regress!    private static boolean equalSets( Map counterpart, Set considered,	Set set1, Set set2 )    {	if (set1.size() != set2.size())	    return false ;	Iterator e1 = set1.iterator() ;	while (e1.hasNext()) {	    java.lang.Object obj1 = e1.next() ;	    boolean found = false ;	    Iterator e2 = set2.iterator() ;	    while (e2.hasNext() && !found) {		java.lang.Object obj2 = e2.next() ;		found = equals( obj1, obj2 ) ;	    }	    if (!found)		return false ;	}	return true ;    }    private static boolean equalLists( Map counterpart, Set considered,	List list1, List list2 )    {	ListIterator e1 = list1.listIterator();	ListIterator e2 = list2.listIterator();	while(e1.hasNext() && e2.hasNext()) {	    java.lang.Object o1 = e1.next();	    java.lang.Object o2 = e2.next();	    if (!(o1==null ? o2==null : equalsHelper( 		counterpart, considered, o1, o2)))		return false;	}	return !(e1.hasNext() || e2.hasNext());    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?