1 7 15 16 package com.sun.corba.se.impl.orbutil; 17 18 import java.security.MessageDigest ; 19 import java.security.NoSuchAlgorithmException ; 20 import java.security.DigestOutputStream ; 21 import java.security.AccessController ; 22 import java.security.PrivilegedExceptionAction ; 23 import java.security.PrivilegedActionException ; 24 import java.security.PrivilegedAction ; 25 26 import java.lang.reflect.Modifier ; 27 import java.lang.reflect.Array ; 28 import java.lang.reflect.Field ; 29 import java.lang.reflect.Member ; 30 import java.lang.reflect.Method ; 31 import java.lang.reflect.Constructor ; 32 import java.lang.reflect.Proxy ; 33 import java.lang.reflect.InvocationTargetException ; 34 35 import java.io.IOException ; 36 import java.io.DataOutputStream ; 37 import java.io.ByteArrayOutputStream ; 38 import java.io.InvalidClassException ; 39 import java.io.Serializable ; 40 41 import java.util.Arrays ; 42 import java.util.Comparator ; 43 import java.util.Hashtable ; 44 45 import org.omg.CORBA.ValueMember ; 46 47 import com.sun.corba.se.impl.io.ValueUtility; 48 import com.sun.corba.se.impl.io.ObjectStreamClass; 49 50 59 71 public class ObjectStreamClass_1_3_1 implements java.io.Serializable { 72 73 public static final long kDefaultUID = -1; 74 75 private static Object noArgsList[] = {}; 76 private static Class noTypesList[] = {}; 77 78 private static Hashtable translatedFields; 79 80 84 static final ObjectStreamClass_1_3_1 lookup(Class cl) 85 { 86 ObjectStreamClass_1_3_1 desc = lookupInternal(cl); 87 if (desc.isSerializable() || desc.isExternalizable()) 88 return desc; 89 return null; 90 } 91 92 96 static ObjectStreamClass_1_3_1 lookupInternal(Class cl) 97 { 98 101 ObjectStreamClass_1_3_1 desc = null; 102 synchronized (descriptorFor) { 103 104 desc = findDescriptorFor(cl); 105 if (desc != null) { 106 return desc; 107 } 108 109 110 boolean serializable = classSerializable.isAssignableFrom(cl); 111 114 ObjectStreamClass_1_3_1 superdesc = null; 115 if (serializable) { 116 Class superclass = cl.getSuperclass(); 117 if (superclass != null) 118 superdesc = lookup(superclass); 119 } 120 121 125 boolean externalizable = false; 126 if (serializable) { 127 externalizable = 128 ((superdesc != null) && superdesc.isExternalizable()) || 129 classExternalizable.isAssignableFrom(cl); 130 if (externalizable) { 131 serializable = false; 132 } 133 } 134 135 138 desc = new ObjectStreamClass_1_3_1(cl, superdesc, 139 serializable, externalizable); 140 } 141 desc.init(); 142 return desc; 143 } 144 145 148 public final String getName() { 149 return name; 150 } 151 152 158 public static final long getSerialVersionUID( java.lang.Class clazz) { 159 ObjectStreamClass_1_3_1 theosc = ObjectStreamClass_1_3_1.lookup( clazz ); 160 if( theosc != null ) 161 { 162 return theosc.getSerialVersionUID( ); 163 } 164 return 0; 165 } 166 167 173 public final long getSerialVersionUID() { 174 return suid; 175 } 176 177 183 public final String getSerialVersionUIDStr() { 184 if (suidStr == null) 185 suidStr = Long.toHexString(suid).toUpperCase(); 186 return suidStr; 187 } 188 189 192 public static final long getActualSerialVersionUID( java.lang.Class clazz ) 193 { 194 ObjectStreamClass_1_3_1 theosc = ObjectStreamClass_1_3_1.lookup( clazz ); 195 if( theosc != null ) 196 { 197 return theosc.getActualSerialVersionUID( ); 198 } 199 return 0; 200 } 201 202 205 public final long getActualSerialVersionUID() { 206 return actualSuid; 207 } 208 209 212 public final String getActualSerialVersionUIDStr() { 213 if (actualSuidStr == null) 214 actualSuidStr = Long.toHexString(actualSuid).toUpperCase(); 215 return actualSuidStr; 216 } 217 218 222 public final Class forClass() { 223 return ofClass; 224 } 225 226 233 public ObjectStreamField[] getFields() { 234 if (fields.length > 0) { 236 ObjectStreamField[] dup = new ObjectStreamField[fields.length]; 237 System.arraycopy(fields, 0, dup, 0, fields.length); 238 return dup; 239 } else { 240 return fields; 241 } 242 } 243 244 public boolean hasField(ValueMember field){ 245 246 for (int i = 0; i < fields.length; i++){ 247 try{ 248 if (fields[i].getName().equals(field.name)) { 249 250 if (fields[i].getSignature().equals(ValueUtility.getSignature(field))) 251 return true; 252 } 253 } 254 catch(Throwable t){} 255 } 256 return false; 257 } 258 259 260 final ObjectStreamField[] getFieldsNoCopy() { 261 return fields; 262 } 263 264 269 public final ObjectStreamField getField(String name) { 270 272 for (int i = fields.length-1; i >= 0; i--) { 273 if (name.equals(fields[i].getName())) { 274 return fields[i]; 275 } 276 } 277 return null; 278 } 279 280 public Serializable writeReplace(Serializable value) { 281 if (writeReplaceObjectMethod != null) { 282 try { 283 return (Serializable ) writeReplaceObjectMethod.invoke(value,noArgsList); 284 } 285 catch(Throwable t) { 286 throw new RuntimeException (t.getMessage()); 287 } 288 } 289 else return value; 290 } 291 292 public Object readResolve(Object value) { 293 if (readResolveObjectMethod != null) { 294 try { 295 return readResolveObjectMethod.invoke(value,noArgsList); 296 } 297 catch(Throwable t) { 298 throw new RuntimeException (t.getMessage()); 299 } 300 } 301 else return value; 302 } 303 304 307 public final String toString() { 308 StringBuffer sb = new StringBuffer (); 309 310 sb.append(name); 311 sb.append(": static final long serialVersionUID = "); 312 sb.append(Long.toString(suid)); 313 sb.append("L;"); 314 return sb.toString(); 315 } 316 317 321 private ObjectStreamClass_1_3_1(java.lang.Class cl, ObjectStreamClass_1_3_1 superdesc, 322 boolean serial, boolean extern) 323 { 324 ofClass = cl; 325 326 if (Proxy.isProxyClass(cl)) { 327 forProxyClass = true; 328 } 329 330 name = cl.getName(); 331 superclass = superdesc; 332 serializable = serial; 333 if (!forProxyClass) { 334 externalizable = extern; 336 } 337 338 343 insertDescriptorFor(this); 344 345 350 } 351 352 359 360 361 private void init() { 362 synchronized (lock) { 363 364 final Class cl = ofClass; 365 366 if (fields != null) return; 368 369 370 if (!serializable || 371 externalizable || 372 forProxyClass || 373 name.equals("java.lang.String")) { 374 fields = NO_FIELDS; 375 } else if (serializable) { 376 377 379 AccessController.doPrivileged(new PrivilegedAction () { 380 public Object run() { 381 385 try { 386 Field pf = cl.getDeclaredField("serialPersistentFields"); 387 pf.setAccessible(true); 390 java.io.ObjectStreamField [] f = 393 (java.io.ObjectStreamField [])pf.get(cl); 394 int mods = pf.getModifiers(); 395 if ((Modifier.isPrivate(mods)) && 396 (Modifier.isStatic(mods)) && 397 (Modifier.isFinal(mods))) 398 { 399 fields = (ObjectStreamField[])translateFields((Object [])pf.get(cl)); 400 } 401 } catch (NoSuchFieldException e) { 402 fields = null; 403 } catch (IllegalAccessException e) { 404 fields = null; 405 } catch (IllegalArgumentException e) { 406 fields = null; 407 } catch (ClassCastException e) { 408 411 fields = null; 412 } 413 414 415 if (fields == null) { 416 424 Field [] actualfields = cl.getDeclaredFields(); 425 426 int numFields = 0; 427 ObjectStreamField[] tempFields = 428 new ObjectStreamField[actualfields.length]; 429 for (int i = 0; i < actualfields.length; i++) { 430 int modifiers = actualfields[i].getModifiers(); 431 if (!Modifier.isStatic(modifiers) && 432 !Modifier.isTransient(modifiers)) { 433 tempFields[numFields++] = 434 new ObjectStreamField(actualfields[i]); 435 } 436 } 437 fields = new ObjectStreamField[numFields]; 438 System.arraycopy(tempFields, 0, fields, 0, numFields); 439 440 } else { 441 for (int j = fields.length-1; j >= 0; j--) { 445 try { 446 Field reflField = cl.getDeclaredField(fields[j].getName()); 447 if (fields[j].getType() == reflField.getType()) { 448 fields[j].setField(reflField); 450 } 451 } catch (NoSuchFieldException e) { 452 } 454 } 455 } 456 return null; 457 } 458 }); 459 460 if (fields.length > 1) 461 Arrays.sort(fields); 462 463 464 computeFieldInfo(); 465 } 466 467 473 if (isNonSerializable()) { 474 suid = 0L; 475 } else { 476 AccessController.doPrivileged(new PrivilegedAction () { 478 public Object run() { 479 if (forProxyClass) { 480 suid = 0L; 482 } else { 483 try { 484 final Field f = cl.getDeclaredField("serialVersionUID"); 485 int mods = f.getModifiers(); 486 if (Modifier.isStatic(mods) && 488 Modifier.isFinal(mods) ) { 489 f.setAccessible(true); 490 suid = f.getLong(cl); 491 } else { 496 suid = ObjectStreamClass.getSerialVersionUID(cl); 497 } 500 } catch (NoSuchFieldException ex) { 501 suid = ObjectStreamClass.getSerialVersionUID(cl); 502 } catch (IllegalAccessException ex) { 505 suid = ObjectStreamClass.getSerialVersionUID(cl); 506 } 507 } 508 509 510 try { 511 writeReplaceObjectMethod = cl.getDeclaredMethod("writeReplace", noTypesList); 512 if (Modifier.isStatic(writeReplaceObjectMethod.getModifiers())) { 513 writeReplaceObjectMethod = null; 514 } else { 515 writeReplaceObjectMethod.setAccessible(true); 516 } 517 518 } catch (NoSuchMethodException e2) { 519 520 } 521 522 try { 523 readResolveObjectMethod = cl.getDeclaredMethod("readResolve", noTypesList); 524 if (Modifier.isStatic(readResolveObjectMethod.getModifiers())) { 525 readResolveObjectMethod = null; 526 } else { 527 readResolveObjectMethod.setAccessible(true); 528 } 529 530 } catch (NoSuchMethodException e2) { 531 532 } 533 534 538 539 if (serializable && !forProxyClass) { 540 541 545 try { 546 Class [] args = {java.io.ObjectOutputStream .class}; 547 writeObjectMethod = cl.getDeclaredMethod("writeObject", args); 548 hasWriteObjectMethod = true; 549 int mods = writeObjectMethod.getModifiers(); 550 551 if (!Modifier.isPrivate(mods) || 553 Modifier.isStatic(mods)) { 554 writeObjectMethod = null; 555 hasWriteObjectMethod = false; 556 } 557 558 } catch (NoSuchMethodException e) { 559 } 560 561 565 try { 566 Class [] args = {java.io.ObjectInputStream .class}; 567 readObjectMethod = cl.getDeclaredMethod("readObject", args); 568 int mods = readObjectMethod.getModifiers(); 569 570 if (!Modifier.isPrivate(mods) || 572 Modifier.isStatic(mods)) { 573 readObjectMethod = null; 574 } 575 } catch (NoSuchMethodException e) { 576 } 577 } 581 return null; 582 } 583 }); 584 } 585 586 actualSuid = computeStructuralUID(this, cl); 587 } 588 589 } 590 591 597 ObjectStreamClass_1_3_1(String n, long s) { 598 name = n; 599 suid = s; 600 superclass = null; 601 } 602 603 private static Object [] translateFields(Object objs[]) 604 throws NoSuchFieldException { 605 try{ 606 java.io.ObjectStreamField fields[] = (java.io.ObjectStreamField [])objs; 607 Object translation[] = null; 608 609 if (translatedFields == null) 610 translatedFields = new Hashtable (); 611 612 translation = (Object [])translatedFields.get(fields); 613 614 if (translation != null) 615 return translation; 616 else { 617 Class osfClass = com.sun.corba.se.impl.orbutil.ObjectStreamField.class; 618 619 translation = (Object [])java.lang.reflect.Array.newInstance(osfClass, objs.length); 620 Object arg[] = new Object [2]; 621 Class types[] = {String .class, Class .class}; 622 Constructor constructor = osfClass.getDeclaredConstructor(types); 623 for (int i = fields.length -1; i >= 0; i--){ 624 arg[0] = fields[i].getName(); 625 arg[1] = fields[i].getType(); 626 627 translation[i] = constructor.newInstance(arg); 628 } 629 translatedFields.put(fields, translation); 630 631 } 632 633 return (Object [])translation; 634 } 635 catch(Throwable t){ 636 throw new NoSuchFieldException (); 637 } 638 } 639 640 649 static boolean compareClassNames(String streamName, 650 String localName, 651 char pkgSeparator) { 652 653 int streamNameIndex = streamName.lastIndexOf(pkgSeparator); 654 if (streamNameIndex < 0) 655 streamNameIndex = 0; 656 657 int localNameIndex = localName.lastIndexOf(pkgSeparator); 658 if (localNameIndex < 0) 659 localNameIndex = 0; 660 661 return streamName.regionMatches(false, streamNameIndex, 662 localName, localNameIndex, 663 streamName.length() - streamNameIndex); 664 } 665 666 670 final boolean typeEquals(ObjectStreamClass_1_3_1 other) { 671 return (suid == other.suid) && 672 compareClassNames(name, other.name, '.'); 673 } 674 675 678 final void setSuperclass(ObjectStreamClass_1_3_1 s) { 679 superclass = s; 680 } 681 682 685 final ObjectStreamClass_1_3_1 getSuperclass() { 686 return superclass; 687 } 688 689 692 final boolean hasWriteObject() { 693 return hasWriteObjectMethod; 694 } 695 696 final boolean isCustomMarshaled() { 697 return (hasWriteObject() || isExternalizable()); 698 } 699 700 726 boolean hasExternalizableBlockDataMode() { 727 return hasExternalizableBlockData; 728 } 729 730 733 final ObjectStreamClass_1_3_1 localClassDescriptor() { 734 return localClassDesc; 735 } 736 737 740 boolean isSerializable() { 741 return serializable; 742 } 743 744 747 boolean isExternalizable() { 748 return externalizable; 749 } 750 751 boolean isNonSerializable() { 752 return ! (externalizable || serializable); 753 } 754 755 760 private void computeFieldInfo() { 761 primBytes = 0; 762 objFields = 0; 763 764 for (int i = 0; i < fields.length; i++ ) { 765 switch (fields[i].getTypeCode()) { 766 case 'B': 767 case 'Z': 768 primBytes += 1; 769 break; 770 case 'C': 771 case 'S': 772 primBytes += 2; 773 break; 774 775 case 'I': 776 case 'F': 777 primBytes += 4; 778 break; 779 case 'J': 780 case 'D' : 781 primBytes += 8; 782 break; 783 784 case 'L': 785 case '[': 786 objFields += 1; 787 break; 788 } 789 } 790 } 791 792 private static long computeStructuralUID(ObjectStreamClass_1_3_1 osc, Class cl) { 793 ByteArrayOutputStream devnull = new ByteArrayOutputStream (512); 794 795 long h = 0; 796 try { 797 798 if ((!java.io.Serializable .class.isAssignableFrom(cl)) || 799 (cl.isInterface())){ 800 return 0; 801 } 802 803 if (java.io.Externalizable .class.isAssignableFrom(cl)) { 804 return 1; 805 } 806 807 MessageDigest md = MessageDigest.getInstance("SHA"); 808 DigestOutputStream mdo = new DigestOutputStream (devnull, md); 809 DataOutputStream data = new DataOutputStream (mdo); 810 811 Class parent = cl.getSuperclass(); 813 if ((parent != null)) 814 { 819 data.writeLong(computeStructuralUID(lookup(parent), parent)); 821 } 822 823 if (osc.hasWriteObject()) 824 data.writeInt(2); 825 else 826 data.writeInt(1); 827 828 829 831 ObjectStreamField[] fields = osc.getFields(); 832 833 int numNonNullFields = 0; 837 for (int i = 0; i < fields.length; i++) 838 if (fields[i].getField() != null) 839 numNonNullFields++; 840 841 Field [] field = new java.lang.reflect.Field [numNonNullFields]; 842 for (int i = 0, fieldNum = 0; i < fields.length; i++) { 843 if (fields[i].getField() != null) { 844 field[fieldNum++] = fields[i].getField(); 845 } 846 } 847 848 if (field.length > 1) 849 Arrays.sort(field, compareMemberByName); 850 851 for (int i = 0; i < field.length; i++) { 852 Field f = field[i]; 853 854 857 int m = f.getModifiers(); 858 868 871 data.writeUTF(f.getName()); 872 data.writeUTF(getSignature(f.getType())); 873 } 874 875 878 data.flush(); 879 byte hasharray[] = md.digest(); 880 for (int i = 0; i < Math.min(8, hasharray.length); i++) { 884 h += (long)(hasharray[i] & 255) << (i * 8); 885 } 886 } catch (IOException ignore) { 887 888 h = -1; 889 } catch (NoSuchAlgorithmException complain) { 890 throw new SecurityException (complain.getMessage()); 891 } 892 return h; 893 } 894 895 898 static String getSignature(Class clazz) { 899 String type = null; 900 if (clazz.isArray()) { 901 Class cl = clazz; 902 int dimensions = 0; 903 while (cl.isArray()) { 904 dimensions++; 905 cl = cl.getComponentType(); 906 } 907 StringBuffer sb = new StringBuffer (); 908 for (int i = 0; i < dimensions; i++) { 909 sb.append("["); 910 } 911 sb.append(getSignature(cl)); 912 type = sb.toString(); 913 } else if (clazz.isPrimitive()) { 914 if (clazz == Integer.TYPE) { 915 type = "I"; 916 } else if (clazz == Byte.TYPE) { 917 type = "B"; 918 } else if (clazz == Long.TYPE) { 919 type = "J"; 920 } else if (clazz == Float.TYPE) { 921 type = "F"; 922 } else if (clazz == Double.TYPE) { 923 type = "D"; 924 } else if (clazz == Short.TYPE) { 925 type = "S"; 926 } else if (clazz == Character.TYPE) { 927 type = "C"; 928 } else if (clazz == Boolean.TYPE) { 929 type = "Z"; 930 } else if (clazz == Void.TYPE) { 931 type = "V"; 932 } 933 } else { 934 type = "L" + clazz.getName().replace('.', '/') + ";"; 935 } 936 return type; 937 } 938 939 942 static String getSignature(Method meth) { 943 StringBuffer sb = new StringBuffer (); 944 945 sb.append("("); 946 947 Class [] params = meth.getParameterTypes(); for (int j = 0; j < params.length; j++) { 949 sb.append(getSignature(params[j])); 950 } 951 sb.append(")"); 952 sb.append(getSignature(meth.getReturnType())); 953 return sb.toString(); 954 } 955 956 959 static String getSignature(Constructor cons) { 960 StringBuffer sb = new StringBuffer (); 961 962 sb.append("("); 963 964 Class [] params = cons.getParameterTypes(); for (int j = 0; j < params.length; j++) { 966 sb.append(getSignature(params[j])); 967 } 968 sb.append(")V"); 969 return sb.toString(); 970 } 971 972 975 static private ObjectStreamClassEntry[] descriptorFor = new ObjectStreamClassEntry[61]; 976 977 984 private static ObjectStreamClass_1_3_1 findDescriptorFor(Class cl) { 985 986 int hash = cl.hashCode(); 987 int index = (hash & 0x7FFFFFFF) % descriptorFor.length; 988 ObjectStreamClassEntry e; 989 ObjectStreamClassEntry prev; 990 991 992 while ((e = descriptorFor[index]) != null && e.get() == null) { 993 descriptorFor[index] = e.next; 994 } 995 996 999 prev = e; 1000 while (e != null ) { 1001 ObjectStreamClass_1_3_1 desc = (ObjectStreamClass_1_3_1)(e.get()); 1002 if (desc == null) { 1003 prev.next = e.next; 1005 } else { 1006 if (desc.ofClass == cl) 1007 return desc; 1008 prev = e; 1009 } 1010 e = e.next; 1011 } 1012 return null; 1013 } 1014 1015 1018 private static void insertDescriptorFor(ObjectStreamClass_1_3_1 desc) { 1019 if (findDescriptorFor(desc.ofClass) != null) { 1021 return; 1022 } 1023 1024 int hash = desc.ofClass.hashCode(); 1025 int index = (hash & 0x7FFFFFFF) % descriptorFor.length; 1026 ObjectStreamClassEntry e = new ObjectStreamClassEntry(desc); 1027 e.next = descriptorFor[index]; 1028 descriptorFor[index] = e; 1029 } 1030 1031 private static Field [] getDeclaredFields(final Class clz) { 1032 return (Field []) AccessController.doPrivileged(new PrivilegedAction () { 1033 public Object run() { 1034 return clz.getDeclaredFields(); 1035 } 1036 }); 1037 } 1038 1039 1040 1043 private String name; 1044 1045 1048 private ObjectStreamClass_1_3_1 superclass; 1049 1050 1053 private boolean serializable; 1054 private boolean externalizable; 1055 1056 1060 private ObjectStreamField[] fields; 1061 1062 1065 private Class ofClass; 1066 1067 1070 boolean forProxyClass; 1071 1072 1073 1076 private long suid = kDefaultUID; 1077 private String suidStr = null; 1078 1079 1082 private long actualSuid = kDefaultUID; 1083 private String actualSuidStr = null; 1084 1085 1089 int primBytes; 1090 int objFields; 1091 1092 1093 private Object lock = new Object (); 1094 1095 1096 private boolean hasWriteObjectMethod; 1097 1098 1104 private boolean hasExternalizableBlockData; 1105 Method writeObjectMethod; 1106 Method readObjectMethod; 1107 private Method writeReplaceObjectMethod; 1108 private Method readResolveObjectMethod; 1109 1110 1113 private ObjectStreamClass_1_3_1 localClassDesc; 1114 1115 1116 1118 1119 private static Class classSerializable = null; 1120 private static Class classExternalizable = null; 1121 1122 1125 static { 1126 try { 1127 classSerializable = Class.forName("java.io.Serializable"); 1128 classExternalizable = Class.forName("java.io.Externalizable"); 1129 } catch (Throwable e) { 1130 System.err.println("Could not load java.io.Serializable or java.io.Externalizable."); 1131 } 1132 } 1133 1134 1135 private static final long serialVersionUID = -6120832682080437368L; 1136 1137 1141 public static final ObjectStreamField[] NO_FIELDS = 1142 new ObjectStreamField[0]; 1143 1144 1148 private static class ObjectStreamClassEntry { 1150 ObjectStreamClassEntry(ObjectStreamClass_1_3_1 c) { 1151 this.c = c; 1153 } 1154 ObjectStreamClassEntry next; 1155 1156 public Object get() 1157 { 1158 return c; 1159 } 1160 private ObjectStreamClass_1_3_1 c; 1161 } 1162 1163 1166 private static Comparator compareClassByName = 1167 new CompareClassByName(); 1168 1169 private static class CompareClassByName implements Comparator { 1170 public int compare(Object o1, Object o2) { 1171 Class c1 = (Class )o1; 1172 Class c2 = (Class )o2; 1173 return (c1.getName()).compareTo(c2.getName()); 1174 } 1175 } 1176 1177 1180 private static Comparator compareMemberByName = 1181 new CompareMemberByName(); 1182 1183 private static class CompareMemberByName implements Comparator { 1184 public int compare(Object o1, Object o2) { 1185 String s1 = ((Member )o1).getName(); 1186 String s2 = ((Member )o2).getName(); 1187 1188 if (o1 instanceof Method ) { 1189 s1 += getSignature((Method )o1); 1190 s2 += getSignature((Method )o2); 1191 } else if (o1 instanceof Constructor ) { 1192 s1 += getSignature((Constructor )o1); 1193 s2 += getSignature((Constructor )o2); 1194 } 1195 return s1.compareTo(s2); 1196 } 1197 } 1198 1199 1201 private static class MethodSignature implements Comparator { 1202 Member member; 1203 String signature; 1205 1207 1209 static MethodSignature[] removePrivateAndSort(Member [] m) { 1210 int numNonPrivate = 0; 1211 for (int i = 0; i < m.length; i++) { 1212 if (! Modifier.isPrivate(m[i].getModifiers())) { 1213 numNonPrivate++; 1214 } 1215 } 1216 MethodSignature[] cm = new MethodSignature[numNonPrivate]; 1217 int cmi = 0; 1218 for (int i = 0; i < m.length; i++) { 1219 if (! Modifier.isPrivate(m[i].getModifiers())) { 1220 cm[cmi] = new MethodSignature(m[i]); 1221 cmi++; 1222 } 1223 } 1224 if (cmi > 0) 1225 Arrays.sort(cm, cm[0]); 1226 return cm; 1227 } 1228 1229 1231 public int compare(Object o1, Object o2) { 1232 1233 if (o1 == o2) 1234 return 0; 1235 1236 MethodSignature c1 = (MethodSignature)o1; 1237 MethodSignature c2 = (MethodSignature)o2; 1238 1239 int result; 1240 if (isConstructor()) { 1241 result = c1.signature.compareTo(c2.signature); 1242 } else { result = c1.member.getName().compareTo(c2.member.getName()); 1244 if (result == 0) 1245 result = c1.signature.compareTo(c2.signature); 1246 } 1247 return result; 1248 } 1249 1250 final private boolean isConstructor() { 1251 return member instanceof Constructor ; 1252 } 1253 private MethodSignature(Member m) { 1254 member = m; 1255 if (isConstructor()) { 1256 signature = ObjectStreamClass_1_3_1.getSignature((Constructor )m); 1257 } else { 1258 signature = ObjectStreamClass_1_3_1.getSignature((Method )m); 1259 } 1260 } 1261 } 1262} 1263 | Popular Tags |