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 + -
显示快捷键?