home *** CD-ROM | disk | FTP | other *** search
/ S283 Planetary Science &n…he Search for Life DVD 2 / DVD-ROM.iso / install / jre1_3 / lib / rt.jar / java / io / ObjectStreamClass.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  16.0 KB  |  892 lines

  1. package java.io;
  2.  
  3. import java.lang.ref.SoftReference;
  4. import java.lang.reflect.AccessibleObject;
  5. import java.lang.reflect.Constructor;
  6. import java.lang.reflect.Field;
  7. import java.lang.reflect.InvocationTargetException;
  8. import java.lang.reflect.Method;
  9. import java.lang.reflect.Modifier;
  10. import java.lang.reflect.Proxy;
  11. import java.security.AccessController;
  12. import java.security.DigestOutputStream;
  13. import java.security.MessageDigest;
  14. import java.security.NoSuchAlgorithmException;
  15. import java.util.Arrays;
  16. import java.util.Comparator;
  17.  
  18. public class ObjectStreamClass implements Serializable {
  19.    private static ObjectStreamClassEntry[] descriptorFor = new ObjectStreamClassEntry[61];
  20.    private String name;
  21.    ObjectStreamClass superclass;
  22.    private boolean serializable;
  23.    private boolean externalizable;
  24.    private ObjectStreamField[] fields;
  25.    private Class ofClass;
  26.    boolean forProxyClass;
  27.    private long suid;
  28.    int numPrimBytes;
  29.    int numObjFields;
  30.    private boolean hasWriteObjectMethod;
  31.    private boolean hasExternalizableBlockData;
  32.    Method writeObjectMethod;
  33.    Method readObjectMethod;
  34.    Method readResolveMethod;
  35.    Method writeReplaceMethod;
  36.    private ObjectStreamClass localClassDesc;
  37.    private boolean disableInstanceDeserialization = false;
  38.    ClassNotFoundException pendingException;
  39.    Class[] ancestors;
  40.    long[] primFieldIDs;
  41.    char[] primFieldTypecodes;
  42.    long[] objFieldIDs;
  43.    Class[] objFieldTypes;
  44.    private Object lock = new Object();
  45.    private static final long serialVersionUID = -6120832682080437368L;
  46.    public static final ObjectStreamField[] NO_FIELDS;
  47.    private static final ObjectStreamField[] serialPersistentFields;
  48.    private static Comparator compareClassByName;
  49.    private static Comparator compareMemberByName;
  50.    private static final Class[] NULL_ARGS;
  51.    private static Class[] OIS_ARGS;
  52.    private static Class[] OOS_ARGS;
  53.    // $FF: synthetic field
  54.    static Class class$java$io$Serializable;
  55.    // $FF: synthetic field
  56.    static Class class$java$io$Externalizable;
  57.    // $FF: synthetic field
  58.    static Class class$java$io$ObjectOutputStream;
  59.    // $FF: synthetic field
  60.    static Class class$java$io$ObjectInputStream;
  61.  
  62.    public static ObjectStreamClass lookup(Class var0) {
  63.       ObjectStreamClass var1 = lookupInternal(var0);
  64.       return !var1.isSerializable() && !var1.isExternalizable() ? null : var1;
  65.    }
  66.  
  67.    static ObjectStreamClass lookupInternal(Class var0) {
  68.       ObjectStreamClass var1 = null;
  69.       ObjectStreamClassEntry[] var2 = descriptorFor;
  70.       synchronized(var2) {
  71.          var1 = findDescriptorFor(var0);
  72.          if (var1 == null) {
  73.             boolean var3 = (class$java$io$Serializable == null ? (class$java$io$Serializable = class$("java.io.Serializable")) : class$java$io$Serializable).isAssignableFrom(var0);
  74.             ObjectStreamClass var4 = null;
  75.             if (var3) {
  76.                Class var5 = var0.getSuperclass();
  77.                if (var5 != null) {
  78.                   var4 = lookup(var5);
  79.                }
  80.             }
  81.  
  82.             boolean var9 = false;
  83.             if (var3) {
  84.                var9 = var4 != null && var4.isExternalizable() || (class$java$io$Externalizable == null ? (class$java$io$Externalizable = class$("java.io.Externalizable")) : class$java$io$Externalizable).isAssignableFrom(var0);
  85.                if (var9) {
  86.                   var3 = false;
  87.                }
  88.             }
  89.  
  90.             var1 = new ObjectStreamClass(var0, var4, var3, var9);
  91.          }
  92.       }
  93.  
  94.       var1.init();
  95.       return var1;
  96.    }
  97.  
  98.    public String getName() {
  99.       return this.name;
  100.    }
  101.  
  102.    public long getSerialVersionUID() {
  103.       return this.suid;
  104.    }
  105.  
  106.    public Class forClass() {
  107.       return this.ofClass;
  108.    }
  109.  
  110.    public ObjectStreamField[] getFields() {
  111.       if (this.fields.length > 0) {
  112.          ObjectStreamField[] var1 = new ObjectStreamField[this.fields.length];
  113.          System.arraycopy(this.fields, 0, var1, 0, this.fields.length);
  114.          return var1;
  115.       } else {
  116.          return this.fields;
  117.       }
  118.    }
  119.  
  120.    final ObjectStreamField[] getFieldsNoCopy() {
  121.       return this.fields;
  122.    }
  123.  
  124.    public ObjectStreamField getField(String var1) {
  125.       ObjectStreamField var2 = ObjectStreamField.constructSearchKey(var1, Byte.TYPE);
  126.       int var3 = -1;
  127.       if (this.numObjFields != this.fields.length) {
  128.          var3 = Arrays.binarySearch(this.fields, var2);
  129.       }
  130.  
  131.       if (var3 < 0 && this.numObjFields > 0) {
  132.          var2.setSearchKeyTypeString(false);
  133.          var3 = Arrays.binarySearch(this.fields, var2);
  134.       }
  135.  
  136.       return var3 < 0 ? null : this.fields[var3];
  137.    }
  138.  
  139.    ObjectStreamField getField(String var1, Class var2) {
  140.       ObjectStreamField var3 = ObjectStreamField.constructSearchKey(var1, var2);
  141.       int var4 = Arrays.binarySearch(this.fields, var3);
  142.       return var4 < 0 ? null : this.fields[var4];
  143.    }
  144.  
  145.    public String toString() {
  146.       StringBuffer var1 = new StringBuffer();
  147.       var1.append(this.name);
  148.       var1.append(": static final long serialVersionUID = ");
  149.       var1.append(Long.toString(this.suid));
  150.       var1.append("L;");
  151.       return var1.toString();
  152.    }
  153.  
  154.    private ObjectStreamClass(Class var1, ObjectStreamClass var2, boolean var3, boolean var4) {
  155.       this.ofClass = var1;
  156.       if (Proxy.isProxyClass(var1)) {
  157.          this.forProxyClass = true;
  158.       }
  159.  
  160.       this.name = var1.getName();
  161.       this.superclass = var2;
  162.       this.serializable = var3;
  163.       if (!this.forProxyClass) {
  164.          this.externalizable = var4;
  165.       }
  166.  
  167.       this.hasExternalizableBlockData = true;
  168.       insertDescriptorFor(this);
  169.    }
  170.  
  171.    private void init() {
  172.       Object var1 = this.lock;
  173.       synchronized(var1) {
  174.          Class var2 = this.ofClass;
  175.          if (this.fields == null) {
  176.             if (this.serializable && !this.externalizable && !this.forProxyClass) {
  177.                if (this.serializable) {
  178.                   AccessController.doPrivileged(new 1(this, var2));
  179.                   if (this.fields.length > 1) {
  180.                      Arrays.sort(this.fields);
  181.                   }
  182.  
  183.                   this.computeFieldInfo();
  184.                }
  185.             } else {
  186.                this.fields = NO_FIELDS;
  187.             }
  188.  
  189.             if (this.isNonSerializable()) {
  190.                this.suid = 0L;
  191.             } else {
  192.                AccessController.doPrivileged(new 2(this, var2));
  193.             }
  194.  
  195.          }
  196.       }
  197.    }
  198.  
  199.    ObjectStreamClass(String var1, long var2) {
  200.       this.name = var1;
  201.       this.suid = var2;
  202.       this.superclass = null;
  203.    }
  204.  
  205.    private void validateLocalClass(Class var1) throws InvalidClassException {
  206.       if (this.localClassDesc == null) {
  207.          throw new InvalidClassException(var1.getName(), "Local class not compatible");
  208.       } else {
  209.          if (this.suid != this.localClassDesc.suid) {
  210.             boolean var2 = this.isNonSerializable() || this.localClassDesc.isNonSerializable();
  211.             boolean var3 = var1.isArray() && !var1.getName().equals(this.name);
  212.             if (!var3 && !var2) {
  213.                throw new InvalidClassException(var1.getName(), "Local class not compatible: stream classdesc serialVersionUID=" + this.suid + " local class serialVersionUID=" + this.localClassDesc.suid);
  214.             }
  215.          }
  216.  
  217.          if (!compareClassNames(this.name, var1.getName(), '.')) {
  218.             throw new InvalidClassException(var1.getName(), "Incompatible local class name. Expected class name compatible with " + this.name);
  219.          } else if (this.serializable && this.localClassDesc.externalizable || this.externalizable && this.localClassDesc.serializable) {
  220.             throw new InvalidClassException(var1.getName(), "Serializable is incompatible with Externalizable");
  221.          }
  222.       }
  223.    }
  224.  
  225.    void setClass(Class var1) throws InvalidClassException {
  226.       if (var1 == null) {
  227.          this.localClassDesc = null;
  228.          this.ofClass = null;
  229.          this.computeFieldInfo();
  230.       } else {
  231.          this.localClassDesc = lookupInternal(var1);
  232.          this.validateLocalClass(var1);
  233.          if (this.serializable == this.localClassDesc.serializable && this.externalizable == this.localClassDesc.externalizable && (this.serializable || this.externalizable)) {
  234.             ObjectStreamField[] var2 = this.localClassDesc.fields;
  235.             ObjectStreamField[] var3 = this.fields;
  236.             int var4 = 0;
  237.  
  238.             for(int var5 = 0; var5 < var3.length; ++var5) {
  239.                for(int var6 = var4; var6 < var2.length; ++var6) {
  240.                   if (var3[var5].getName().equals(var2[var6].getName())) {
  241.                      if (var3[var5].isPrimitive() && !var3[var5].typeEquals(var2[var6])) {
  242.                         throw new InvalidClassException(var1.getName(), "The type of field " + var2[var5].getName() + " of class " + this.name + " is incompatible.");
  243.                      }
  244.  
  245.                      var4 = var6;
  246.                      var3[var5].setField(var2[var6].getField());
  247.                      break;
  248.                   }
  249.                }
  250.             }
  251.  
  252.             this.ofClass = var1;
  253.             this.computeFieldInfo();
  254.             this.readObjectMethod = this.localClassDesc.readObjectMethod;
  255.             this.readResolveMethod = this.localClassDesc.readResolveMethod;
  256.          } else {
  257.             this.disableInstanceDeserialization = true;
  258.             this.ofClass = var1;
  259.          }
  260.       }
  261.    }
  262.  
  263.    static boolean compareClassNames(String var0, String var1, char var2) {
  264.       int var3 = var0.lastIndexOf(var2);
  265.       if (var3 < 0) {
  266.          var3 = 0;
  267.       }
  268.  
  269.       int var4 = var1.lastIndexOf(var2);
  270.       if (var4 < 0) {
  271.          var4 = 0;
  272.       }
  273.  
  274.       return var0.regionMatches(false, var3, var1, var4, var0.length() - var3);
  275.    }
  276.  
  277.    boolean typeEquals(ObjectStreamClass var1) {
  278.       return this.suid == var1.suid && compareClassNames(this.name, var1.name, '.');
  279.    }
  280.  
  281.    void setSuperclass(ObjectStreamClass var1) {
  282.       this.superclass = var1;
  283.    }
  284.  
  285.    ObjectStreamClass getSuperclass() {
  286.       return this.superclass;
  287.    }
  288.  
  289.    boolean hasWriteObject() {
  290.       return this.hasWriteObjectMethod;
  291.    }
  292.  
  293.    boolean hasExternalizableBlockDataMode() {
  294.       return this.hasExternalizableBlockData;
  295.    }
  296.  
  297.    ObjectStreamClass localClassDescriptor() {
  298.       return this.localClassDesc;
  299.    }
  300.  
  301.    boolean isSerializable() {
  302.       return this.serializable;
  303.    }
  304.  
  305.    boolean isExternalizable() {
  306.       return this.externalizable;
  307.    }
  308.  
  309.    boolean isNonSerializable() {
  310.       return !this.externalizable && !this.serializable;
  311.    }
  312.  
  313.    private void computeFieldInfo() {
  314.       this.numPrimBytes = 0;
  315.       this.numObjFields = 0;
  316.  
  317.       for(int var1 = 0; var1 < this.fields.length; ++var1) {
  318.          switch (this.fields[var1].getTypeCode()) {
  319.             case 'B':
  320.             case 'Z':
  321.                this.fields[var1].setOffset(this.numPrimBytes);
  322.                ++this.numPrimBytes;
  323.                break;
  324.             case 'C':
  325.             case 'S':
  326.                this.fields[var1].setOffset(this.numPrimBytes);
  327.                this.numPrimBytes += 2;
  328.                break;
  329.             case 'D':
  330.             case 'J':
  331.                this.fields[var1].setOffset(this.numPrimBytes);
  332.                this.numPrimBytes += 8;
  333.             case 'E':
  334.             case 'G':
  335.             case 'H':
  336.             case 'K':
  337.             case 'M':
  338.             case 'N':
  339.             case 'O':
  340.             case 'P':
  341.             case 'Q':
  342.             case 'R':
  343.             case 'T':
  344.             case 'U':
  345.             case 'V':
  346.             case 'W':
  347.             case 'X':
  348.             case 'Y':
  349.             default:
  350.                break;
  351.             case 'F':
  352.             case 'I':
  353.                this.fields[var1].setOffset(this.numPrimBytes);
  354.                this.numPrimBytes += 4;
  355.                break;
  356.             case 'L':
  357.             case '[':
  358.                this.fields[var1].setOffset(this.numObjFields);
  359.                ++this.numObjFields;
  360.          }
  361.       }
  362.  
  363.       if (this.ofClass != null) {
  364.          int var2 = this.fields.length - this.numObjFields;
  365.          if (var2 > 0) {
  366.             this.primFieldIDs = new long[var2];
  367.             this.primFieldTypecodes = new char[var2];
  368.          }
  369.  
  370.          if (this.numObjFields > 0) {
  371.             this.objFieldIDs = new long[this.numObjFields];
  372.             this.objFieldTypes = new Class[this.numObjFields];
  373.          }
  374.  
  375.          getFieldIDs(this.fields, this.primFieldIDs, this.objFieldIDs);
  376.          int var3 = 0;
  377.          int var4 = 0;
  378.  
  379.          try {
  380.             for(int var5 = 0; var5 < this.fields.length; ++var5) {
  381.                char var6 = this.fields[var5].getTypeCode();
  382.                switch (var6) {
  383.                   case 'L':
  384.                   case '[':
  385.                      Field var7 = this.fields[var5].getField();
  386.                      this.objFieldTypes[var3++] = var7 != null ? var7.getType() : null;
  387.                      break;
  388.                   default:
  389.                      this.primFieldTypecodes[var4++] = var6;
  390.                }
  391.             }
  392.          } catch (ArrayIndexOutOfBoundsException var8) {
  393.             throw new InternalError("field count mismatch for class " + this.ofClass.getName());
  394.          }
  395.  
  396.          if (var3 != this.numObjFields || var4 != var2) {
  397.             throw new InternalError("field count mismatch for class " + this.ofClass.getName());
  398.          }
  399.       }
  400.  
  401.    }
  402.  
  403.    private static long computeSerialVersionUID(Class var0) {
  404.       ByteArrayOutputStream var1 = new ByteArrayOutputStream(512);
  405.       long var2 = 0L;
  406.  
  407.       try {
  408.          MessageDigest var4 = MessageDigest.getInstance("SHA");
  409.          DigestOutputStream var5 = new DigestOutputStream(var1, var4);
  410.          DataOutputStream var6 = new DataOutputStream(var5);
  411.          var6.writeUTF(var0.getName());
  412.          int var7 = var0.getModifiers();
  413.          var7 &= 1553;
  414.          Method[] var8 = var0.getDeclaredMethods();
  415.          if ((var7 & 512) != 0) {
  416.             var7 &= -1025;
  417.             if (var8.length > 0) {
  418.                var7 |= 1024;
  419.             }
  420.          }
  421.  
  422.          var6.writeInt(var7);
  423.          if (!var0.isArray()) {
  424.             Class[] var9 = var0.getInterfaces();
  425.             Arrays.sort(var9, compareClassByName);
  426.  
  427.             for(int var10 = 0; var10 < var9.length; ++var10) {
  428.                var6.writeUTF(var9[var10].getName());
  429.             }
  430.          }
  431.  
  432.          Field[] var20 = var0.getDeclaredFields();
  433.          Arrays.sort(var20, compareMemberByName);
  434.  
  435.          for(int var21 = 0; var21 < var20.length; ++var21) {
  436.             Field var11 = var20[var21];
  437.             int var12 = var11.getModifiers();
  438.             if (!Modifier.isPrivate(var12) || !Modifier.isTransient(var12) && !Modifier.isStatic(var12)) {
  439.                var6.writeUTF(var11.getName());
  440.                var6.writeInt(var12);
  441.                var6.writeUTF(getSignature(var11.getType()));
  442.             }
  443.          }
  444.  
  445.          if (hasStaticInitializer(var0)) {
  446.             var6.writeUTF("<clinit>");
  447.             var6.writeInt(8);
  448.             var6.writeUTF("()V");
  449.          }
  450.  
  451.          MethodSignature[] var22 = java.io.ObjectStreamClass.MethodSignature.removePrivateAndSort(var0.getDeclaredConstructors());
  452.  
  453.          for(int var23 = 0; var23 < var22.length; ++var23) {
  454.             MethodSignature var13 = var22[var23];
  455.             String var14 = "<init>";
  456.             String var15 = var13.signature;
  457.             var15 = var15.replace('/', '.');
  458.             var6.writeUTF(var14);
  459.             var6.writeInt(var13.member.getModifiers());
  460.             var6.writeUTF(var15);
  461.          }
  462.  
  463.          MethodSignature[] var24 = java.io.ObjectStreamClass.MethodSignature.removePrivateAndSort(var8);
  464.  
  465.          for(int var25 = 0; var25 < var24.length; ++var25) {
  466.             MethodSignature var27 = var24[var25];
  467.             String var16 = var27.signature;
  468.             var16 = var16.replace('/', '.');
  469.             var6.writeUTF(var27.member.getName());
  470.             var6.writeInt(var27.member.getModifiers());
  471.             var6.writeUTF(var16);
  472.          }
  473.  
  474.          var6.flush();
  475.          byte[] var28 = var4.digest();
  476.  
  477.          for(int var30 = 0; var30 < Math.min(8, var28.length); ++var30) {
  478.             var2 += (long)(var28[var30] & 255) << var30 * 8;
  479.          }
  480.       } catch (IOException var17) {
  481.          var2 = -1L;
  482.       } catch (NoSuchAlgorithmException var18) {
  483.          throw new SecurityException(((Throwable)var18).getMessage());
  484.       }
  485.  
  486.       return var2;
  487.    }
  488.  
  489.    static String getSignature(Class var0) {
  490.       String var1 = null;
  491.       if (var0.isArray()) {
  492.          Class var2 = var0;
  493.  
  494.          int var3;
  495.          for(var3 = 0; var2.isArray(); var2 = var2.getComponentType()) {
  496.             ++var3;
  497.          }
  498.  
  499.          StringBuffer var4 = new StringBuffer();
  500.  
  501.          for(int var5 = 0; var5 < var3; ++var5) {
  502.             var4.append("[");
  503.          }
  504.  
  505.          var4.append(getSignature(var2));
  506.          var1 = var4.toString();
  507.       } else if (var0.isPrimitive()) {
  508.          if (var0 == Integer.TYPE) {
  509.             var1 = "I";
  510.          } else if (var0 == Byte.TYPE) {
  511.             var1 = "B";
  512.          } else if (var0 == Long.TYPE) {
  513.             var1 = "J";
  514.          } else if (var0 == Float.TYPE) {
  515.             var1 = "F";
  516.          } else if (var0 == Double.TYPE) {
  517.             var1 = "D";
  518.          } else if (var0 == Short.TYPE) {
  519.             var1 = "S";
  520.          } else if (var0 == Character.TYPE) {
  521.             var1 = "C";
  522.          } else if (var0 == Boolean.TYPE) {
  523.             var1 = "Z";
  524.          } else if (var0 == Void.TYPE) {
  525.             var1 = "V";
  526.          }
  527.       } else {
  528.          var1 = "L" + var0.getName().replace('.', '/') + ";";
  529.       }
  530.  
  531.       return var1;
  532.    }
  533.  
  534.    static String getSignature(Method var0) {
  535.       StringBuffer var1 = new StringBuffer();
  536.       var1.append("(");
  537.       Class[] var2 = var0.getParameterTypes();
  538.  
  539.       for(int var3 = 0; var3 < var2.length; ++var3) {
  540.          var1.append(getSignature(var2[var3]));
  541.       }
  542.  
  543.       var1.append(")");
  544.       var1.append(getSignature(var0.getReturnType()));
  545.       return var1.toString();
  546.    }
  547.  
  548.    static String getSignature(Constructor var0) {
  549.       StringBuffer var1 = new StringBuffer();
  550.       var1.append("(");
  551.       Class[] var2 = var0.getParameterTypes();
  552.  
  553.       for(int var3 = 0; var3 < var2.length; ++var3) {
  554.          var1.append(getSignature(var2[var3]));
  555.       }
  556.  
  557.       var1.append(")V");
  558.       return var1.toString();
  559.    }
  560.  
  561.    void write(ObjectOutputStream var1) throws IOException {
  562.       int var2 = 0;
  563.       if (this.hasWriteObjectMethod) {
  564.          var2 |= 1;
  565.       }
  566.  
  567.       if (this.serializable) {
  568.          var2 |= 2;
  569.       }
  570.  
  571.       if (this.externalizable) {
  572.          var2 |= 4;
  573.          if (!var1.useDeprecatedExternalizableFormat) {
  574.             var2 |= 8;
  575.          }
  576.       }
  577.  
  578.       var1.writeByte(var2);
  579.       if (this.fields == null) {
  580.          var1.writeShort(0);
  581.       } else {
  582.          var1.writeShort(this.fields.length);
  583.  
  584.          for(int var3 = 0; var3 < this.fields.length; ++var3) {
  585.             ObjectStreamField var4 = this.fields[var3];
  586.             var1.writeByte(var4.getTypeCode());
  587.             var1.writeUTF(var4.getName());
  588.             if (!var4.isPrimitive()) {
  589.                var1.writeTypeString(var4.getTypeString());
  590.             }
  591.          }
  592.  
  593.       }
  594.    }
  595.  
  596.    void read(ObjectInputStream var1) throws IOException, ClassNotFoundException {
  597.       byte var2 = var1.readByte();
  598.       this.serializable = (var2 & 2) != 0;
  599.       this.externalizable = (var2 & 4) != 0;
  600.       this.hasWriteObjectMethod = this.serializable ? (var2 & 1) != 0 : false;
  601.       this.hasExternalizableBlockData = this.externalizable ? (var2 & 8) != 0 : false;
  602.       short var3 = var1.readShort();
  603.       this.fields = new ObjectStreamField[var3];
  604.       boolean var4 = var1.enableResolve;
  605.       var1.enableResolve = false;
  606.  
  607.       try {
  608.          for(int var5 = 0; var5 < var3; ++var5) {
  609.             char var6 = (char)var1.readByte();
  610.             String var7 = var1.readUTF();
  611.             String var8 = null;
  612.             switch (var6) {
  613.                case 'E':
  614.                case 'G':
  615.                case 'H':
  616.                case 'K':
  617.                case 'M':
  618.                case 'N':
  619.                case 'O':
  620.                case 'P':
  621.                case 'Q':
  622.                case 'R':
  623.                case 'T':
  624.                case 'U':
  625.                case 'V':
  626.                case 'W':
  627.                case 'X':
  628.                case 'Y':
  629.                default:
  630.                   throw new StreamCorruptedException("illegal field descriptor typecode: " + var6);
  631.                case 'L':
  632.                case '[':
  633.                   var8 = (String)var1.readObject();
  634.                case 'B':
  635.                case 'C':
  636.                case 'D':
  637.                case 'F':
  638.                case 'I':
  639.                case 'J':
  640.                case 'S':
  641.                case 'Z':
  642.                   this.fields[var5] = new ObjectStreamField(var7, var6, (Field)null, var8);
  643.             }
  644.          }
  645.       } finally {
  646.          var1.enableResolve = var4;
  647.       }
  648.  
  649.    }
  650.  
  651.    void lightCopy(ObjectStreamClass var1) {
  652.       this.name = var1.name;
  653.       this.serializable = var1.serializable;
  654.       this.externalizable = var1.externalizable;
  655.       this.fields = new ObjectStreamField[var1.fields.length];
  656.  
  657.       for(int var2 = 0; var2 < this.fields.length; ++var2) {
  658.          ObjectStreamField var3 = var1.fields[var2];
  659.          this.fields[var2] = new ObjectStreamField(var3.getName(), var3.getTypeCode(), (Field)null, var3.getTypeString());
  660.       }
  661.  
  662.       this.suid = var1.suid;
  663.       this.hasWriteObjectMethod = var1.hasWriteObjectMethod;
  664.       this.hasExternalizableBlockData = var1.hasExternalizableBlockData;
  665.    }
  666.  
  667.    void initProxyClassDesc(Class var1) {
  668.       this.forProxyClass = true;
  669.       if (var1 != null) {
  670.          this.name = var1.getName();
  671.       }
  672.  
  673.       this.serializable = true;
  674.       this.externalizable = false;
  675.       this.fields = NO_FIELDS;
  676.       this.hasWriteObjectMethod = false;
  677.       this.hasExternalizableBlockData = true;
  678.    }
  679.  
  680.    void verifyInstanceDeserialization() throws InvalidClassException {
  681.       if (this.disableInstanceDeserialization) {
  682.          String var1 = !this.serializable && !this.externalizable ? this.getName() : this.localClassDesc.getName();
  683.          String var2 = !this.serializable && !this.localClassDesc.serializable ? (!this.externalizable && !this.localClassDesc.externalizable ? "Serializable or Externalizable" : "Externalizable") : "Serializable";
  684.          throw new InvalidClassException(var1, "is not " + var2);
  685.       }
  686.    }
  687.  
  688.    private static ObjectStreamClass findDescriptorFor(Class var0) {
  689.       int var1 = var0.hashCode();
  690.  
  691.       ObjectStreamClassEntry var3;
  692.       for(int var2 = (var1 & Integer.MAX_VALUE) % descriptorFor.length; (var3 = descriptorFor[var2]) != null && ((SoftReference)var3).get() == null; descriptorFor[var2] = var3.next) {
  693.       }
  694.  
  695.       for(ObjectStreamClassEntry var4 = var3; var3 != null; var3 = var3.next) {
  696.          ObjectStreamClass var5 = (ObjectStreamClass)((SoftReference)var3).get();
  697.          if (var5 == null) {
  698.             var4.next = var3.next;
  699.          } else {
  700.             if (var5.ofClass == var0) {
  701.                return var5;
  702.             }
  703.  
  704.             var4 = var3;
  705.          }
  706.       }
  707.  
  708.       return null;
  709.    }
  710.  
  711.    private static void insertDescriptorFor(ObjectStreamClass var0) {
  712.       if (findDescriptorFor(var0.ofClass) == null) {
  713.          int var1 = var0.ofClass.hashCode();
  714.          int var2 = (var1 & Integer.MAX_VALUE) % descriptorFor.length;
  715.          ObjectStreamClassEntry var3 = new ObjectStreamClassEntry(var0);
  716.          var3.next = descriptorFor[var2];
  717.          descriptorFor[var2] = var3;
  718.       }
  719.    }
  720.  
  721.    private static native void initNative();
  722.  
  723.    private static native void getFieldIDs(ObjectStreamField[] var0, long[] var1, long[] var2);
  724.  
  725.    private static native boolean hasStaticInitializer(Class var0);
  726.  
  727.    boolean isResolvable() {
  728.       return this.readResolveMethod != null;
  729.    }
  730.  
  731.    boolean isReplaceable() {
  732.       return this.writeReplaceMethod != null;
  733.    }
  734.  
  735.    static Object invokeMethod(Method var0, Object var1, Object[] var2) throws IOException {
  736.       Object var3 = null;
  737.  
  738.       try {
  739.          var3 = var0.invoke(var1, var2);
  740.          return var3;
  741.       } catch (InvocationTargetException var6) {
  742.          Throwable var5 = var6.getTargetException();
  743.          if (var5 instanceof IOException) {
  744.             throw (IOException)var5;
  745.          } else if (var5 instanceof RuntimeException) {
  746.             throw (RuntimeException)var5;
  747.          } else if (var5 instanceof Error) {
  748.             throw (Error)var5;
  749.          } else {
  750.             throw new Error("interal error");
  751.          }
  752.       } catch (IllegalAccessException var7) {
  753.          throw new Error("interal error");
  754.       }
  755.    }
  756.  
  757.    private Method getDeclaredMethod(String var1, Class[] var2, int var3, int var4) {
  758.       Method var5 = null;
  759.  
  760.       try {
  761.          var5 = this.ofClass.getDeclaredMethod(var1, var2);
  762.          if (var5 != null) {
  763.             int var6 = var5.getModifiers();
  764.             if ((var6 & var4) == 0 && (var6 & var3) == var3) {
  765.                ((AccessibleObject)var5).setAccessible(true);
  766.             } else {
  767.                var5 = null;
  768.             }
  769.          }
  770.       } catch (NoSuchMethodException var7) {
  771.       }
  772.  
  773.       return var5;
  774.    }
  775.  
  776.    private boolean checkSuperMethodAccess(Method var1) {
  777.       if (var1 == null) {
  778.          return false;
  779.       } else {
  780.          int var2 = var1.getModifiers();
  781.          if (!Modifier.isPublic(var2) && !Modifier.isProtected(var2)) {
  782.             return Modifier.isPrivate(var2) ? false : isSameClassPackage(var1.getDeclaringClass(), this.ofClass);
  783.          } else {
  784.             return true;
  785.          }
  786.       }
  787.    }
  788.  
  789.    private static boolean isSameClassPackage(Class var0, Class var1) {
  790.       if (var0.getClassLoader() != var1.getClassLoader()) {
  791.          return false;
  792.       } else {
  793.          String var2 = var0.getName();
  794.          String var3 = var1.getName();
  795.          int var4 = var2.lastIndexOf(46);
  796.          int var5 = var3.lastIndexOf(46);
  797.          if (var4 != -1 && var5 != -1) {
  798.             return var2.regionMatches(false, 0, var3, 0, var4 - 1);
  799.          } else {
  800.             return var4 == var5;
  801.          }
  802.       }
  803.    }
  804.  
  805.    private static void initStaticMethodArgs() {
  806.       OOS_ARGS = new Class[1];
  807.       OOS_ARGS[0] = class$java$io$ObjectOutputStream == null ? (class$java$io$ObjectOutputStream = class$("java.io.ObjectOutputStream")) : class$java$io$ObjectOutputStream;
  808.       OIS_ARGS = new Class[1];
  809.       OIS_ARGS[0] = class$java$io$ObjectInputStream == null ? (class$java$io$ObjectInputStream = class$("java.io.ObjectInputStream")) : class$java$io$ObjectInputStream;
  810.    }
  811.  
  812.    // $FF: synthetic method
  813.    static Class class$(String var0) {
  814.       try {
  815.          return Class.forName(var0);
  816.       } catch (ClassNotFoundException var2) {
  817.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  818.       }
  819.    }
  820.  
  821.    // $FF: synthetic method
  822.    static ObjectStreamField[] access$002(ObjectStreamClass var0, ObjectStreamField[] var1) {
  823.       return var0.fields = var1;
  824.    }
  825.  
  826.    // $FF: synthetic method
  827.    static ObjectStreamField[] access$000(ObjectStreamClass var0) {
  828.       return var0.fields;
  829.    }
  830.  
  831.    // $FF: synthetic method
  832.    static long access$102(ObjectStreamClass var0, long var1) {
  833.       return var0.suid = var1;
  834.    }
  835.  
  836.    // $FF: synthetic method
  837.    static long access$200(Class var0) {
  838.       return computeSerialVersionUID(var0);
  839.    }
  840.  
  841.    // $FF: synthetic method
  842.    static Class[] access$300() {
  843.       return NULL_ARGS;
  844.    }
  845.  
  846.    // $FF: synthetic method
  847.    static Method access$400(ObjectStreamClass var0, String var1, Class[] var2, int var3, int var4) {
  848.       return var0.getDeclaredMethod(var1, var2, var3, var4);
  849.    }
  850.  
  851.    // $FF: synthetic method
  852.    static boolean access$500(ObjectStreamClass var0, Method var1) {
  853.       return var0.checkSuperMethodAccess(var1);
  854.    }
  855.  
  856.    // $FF: synthetic method
  857.    static boolean access$600(ObjectStreamClass var0) {
  858.       return var0.serializable;
  859.    }
  860.  
  861.    // $FF: synthetic method
  862.    static Class[] access$700() {
  863.       return OOS_ARGS;
  864.    }
  865.  
  866.    // $FF: synthetic method
  867.    static Class[] access$800() {
  868.       return OIS_ARGS;
  869.    }
  870.  
  871.    // $FF: synthetic method
  872.    static void access$900() {
  873.       initStaticMethodArgs();
  874.    }
  875.  
  876.    // $FF: synthetic method
  877.    static boolean access$1002(ObjectStreamClass var0, boolean var1) {
  878.       return var0.hasWriteObjectMethod = var1;
  879.    }
  880.  
  881.    static {
  882.       initNative();
  883.       NO_FIELDS = new ObjectStreamField[0];
  884.       serialPersistentFields = NO_FIELDS;
  885.       compareClassByName = new CompareClassByName((1)null);
  886.       compareMemberByName = new CompareMemberByName((1)null);
  887.       NULL_ARGS = new Class[0];
  888.       OIS_ARGS = null;
  889.       OOS_ARGS = null;
  890.    }
  891. }
  892.