home *** CD-ROM | disk | FTP | other *** search
- package java.io;
-
- import java.lang.ref.Reference;
- import java.lang.ref.ReferenceQueue;
- import java.lang.ref.SoftReference;
- import java.lang.ref.WeakReference;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- import java.security.AccessController;
- import java.security.MessageDigest;
- import java.security.NoSuchAlgorithmException;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collections;
- import java.util.HashSet;
- import java.util.concurrent.ConcurrentMap;
- import sun.reflect.ReflectionFactory;
-
- public class ObjectStreamClass implements Serializable {
- public static final ObjectStreamField[] NO_FIELDS = new ObjectStreamField[0];
- private static final long serialVersionUID = -6120832682080437368L;
- private static final ObjectStreamField[] serialPersistentFields;
- private static final ReflectionFactory reflFactory;
- // $FF: renamed from: cl java.lang.Class
- private Class field_0;
- private String name;
- private volatile Long suid;
- private boolean isProxy;
- private boolean isEnum;
- private boolean serializable;
- private boolean externalizable;
- private boolean hasWriteObjectData;
- private boolean hasBlockExternalData = true;
- private ClassNotFoundException resolveEx;
- private InvalidClassException deserializeEx;
- private InvalidClassException serializeEx;
- private InvalidClassException defaultSerializeEx;
- private ObjectStreamField[] fields;
- private int primDataSize;
- private int numObjFields;
- private FieldReflector fieldRefl;
- private volatile ClassDataSlot[] dataLayout;
- private Constructor cons;
- private Method writeObjectMethod;
- private Method readObjectMethod;
- private Method readObjectNoDataMethod;
- private Method writeReplaceMethod;
- private Method readResolveMethod;
- private ObjectStreamClass localDesc;
- private ObjectStreamClass superDesc;
-
- private static native void initNative();
-
- public static ObjectStreamClass lookup(Class<?> var0) {
- return lookup(var0, false);
- }
-
- public static ObjectStreamClass lookupAny(Class<?> var0) {
- return lookup(var0, true);
- }
-
- public String getName() {
- return this.name;
- }
-
- public long getSerialVersionUID() {
- if (this.suid == null) {
- this.suid = (Long)AccessController.doPrivileged(new 1(this));
- }
-
- return this.suid;
- }
-
- public Class<?> forClass() {
- return this.field_0;
- }
-
- public ObjectStreamField[] getFields() {
- return this.getFields(true);
- }
-
- public ObjectStreamField getField(String var1) {
- return this.getField(var1, (Class)null);
- }
-
- public String toString() {
- return this.name + ": static final long serialVersionUID = " + this.getSerialVersionUID() + "L;";
- }
-
- static ObjectStreamClass lookup(Class var0, boolean var1) {
- if (!var1 && !Serializable.class.isAssignableFrom(var0)) {
- return null;
- } else {
- processQueue(java.io.ObjectStreamClass.Caches.access$200(), java.io.ObjectStreamClass.Caches.localDescs);
- WeakClassKey var2 = new WeakClassKey(var0, java.io.ObjectStreamClass.Caches.access$200());
- Reference var3 = (Reference)java.io.ObjectStreamClass.Caches.localDescs.get(var2);
- Object var4 = null;
- if (var3 != null) {
- var4 = var3.get();
- }
-
- EntryFuture var5 = null;
- if (var4 == null) {
- EntryFuture var6 = new EntryFuture((1)null);
- SoftReference var7 = new SoftReference(var6);
-
- do {
- if (var3 != null) {
- java.io.ObjectStreamClass.Caches.localDescs.remove(var2, var3);
- }
-
- var3 = (Reference)java.io.ObjectStreamClass.Caches.localDescs.putIfAbsent(var2, var7);
- if (var3 != null) {
- var4 = var3.get();
- }
- } while(var3 != null && var4 == null);
-
- if (var4 == null) {
- var5 = var6;
- }
- }
-
- if (var4 instanceof ObjectStreamClass) {
- return (ObjectStreamClass)var4;
- } else {
- if (var4 instanceof EntryFuture) {
- var5 = (EntryFuture)var4;
- if (var5.getOwner() == Thread.currentThread()) {
- var4 = null;
- } else {
- var4 = var5.get();
- }
- }
-
- if (var4 == null) {
- try {
- var4 = new ObjectStreamClass(var0);
- } catch (Throwable var8) {
- var4 = var8;
- }
-
- if (var5.set(var4)) {
- java.io.ObjectStreamClass.Caches.localDescs.put(var2, new SoftReference(var4));
- } else {
- var4 = var5.get();
- }
- }
-
- if (var4 instanceof ObjectStreamClass) {
- return (ObjectStreamClass)var4;
- } else if (var4 instanceof RuntimeException) {
- throw (RuntimeException)var4;
- } else if (var4 instanceof Error) {
- throw (Error)var4;
- } else {
- throw new InternalError("unexpected entry: " + var4);
- }
- }
- }
- }
-
- private ObjectStreamClass(Class var1) {
- this.field_0 = var1;
- this.name = var1.getName();
- this.isProxy = Proxy.isProxyClass(var1);
- this.isEnum = Enum.class.isAssignableFrom(var1);
- this.serializable = Serializable.class.isAssignableFrom(var1);
- this.externalizable = Externalizable.class.isAssignableFrom(var1);
- Class var2 = var1.getSuperclass();
- this.superDesc = var2 != null ? lookup(var2, false) : null;
- this.localDesc = this;
- if (this.serializable) {
- AccessController.doPrivileged(new 2(this, var1));
- } else {
- this.suid = 0L;
- this.fields = NO_FIELDS;
- }
-
- try {
- this.fieldRefl = getReflector(this.fields, this);
- } catch (InvalidClassException var4) {
- throw new InternalError();
- }
-
- if (this.deserializeEx == null) {
- if (this.isEnum) {
- this.deserializeEx = new InvalidClassException(this.name, "enum type");
- } else if (this.cons == null) {
- this.deserializeEx = new InvalidClassException(this.name, "no valid constructor");
- }
- }
-
- for(int var3 = 0; var3 < this.fields.length; ++var3) {
- if (this.fields[var3].getField() == null) {
- this.defaultSerializeEx = new InvalidClassException(this.name, "unmatched serializable field(s) declared");
- }
- }
-
- }
-
- ObjectStreamClass() {
- }
-
- void initProxy(Class var1, ClassNotFoundException var2, ObjectStreamClass var3) throws InvalidClassException {
- this.field_0 = var1;
- this.resolveEx = var2;
- this.superDesc = var3;
- this.isProxy = true;
- this.serializable = true;
- this.suid = 0L;
- this.fields = NO_FIELDS;
- if (var1 != null) {
- this.localDesc = lookup(var1, true);
- if (!this.localDesc.isProxy) {
- throw new InvalidClassException("cannot bind proxy descriptor to a non-proxy class");
- }
-
- this.name = this.localDesc.name;
- this.externalizable = this.localDesc.externalizable;
- this.cons = this.localDesc.cons;
- this.writeReplaceMethod = this.localDesc.writeReplaceMethod;
- this.readResolveMethod = this.localDesc.readResolveMethod;
- this.deserializeEx = this.localDesc.deserializeEx;
- }
-
- this.fieldRefl = getReflector(this.fields, this.localDesc);
- }
-
- void initNonProxy(ObjectStreamClass var1, Class var2, ClassNotFoundException var3, ObjectStreamClass var4) throws InvalidClassException {
- this.field_0 = var2;
- this.resolveEx = var3;
- this.superDesc = var4;
- this.name = var1.name;
- this.suid = var1.getSerialVersionUID();
- this.isProxy = false;
- this.isEnum = var1.isEnum;
- this.serializable = var1.serializable;
- this.externalizable = var1.externalizable;
- this.hasBlockExternalData = var1.hasBlockExternalData;
- this.hasWriteObjectData = var1.hasWriteObjectData;
- this.fields = var1.fields;
- this.primDataSize = var1.primDataSize;
- this.numObjFields = var1.numObjFields;
- if (var2 != null) {
- this.localDesc = lookup(var2, true);
- if (this.localDesc.isProxy) {
- throw new InvalidClassException("cannot bind non-proxy descriptor to a proxy class");
- }
-
- if (this.isEnum != this.localDesc.isEnum) {
- throw new InvalidClassException(this.isEnum ? "cannot bind enum descriptor to a non-enum class" : "cannot bind non-enum descriptor to an enum class");
- }
-
- if (this.serializable == this.localDesc.serializable && !var2.isArray() && this.suid != this.localDesc.getSerialVersionUID()) {
- throw new InvalidClassException(this.localDesc.name, "local class incompatible: stream classdesc serialVersionUID = " + this.suid + ", local class serialVersionUID = " + this.localDesc.getSerialVersionUID());
- }
-
- if (!classNamesEqual(this.name, this.localDesc.name)) {
- throw new InvalidClassException(this.localDesc.name, "local class name incompatible with stream class name \"" + this.name + "\"");
- }
-
- if (!this.isEnum) {
- if (this.serializable == this.localDesc.serializable && this.externalizable != this.localDesc.externalizable) {
- throw new InvalidClassException(this.localDesc.name, "Serializable incompatible with Externalizable");
- }
-
- if (this.serializable != this.localDesc.serializable || this.externalizable != this.localDesc.externalizable || !this.serializable && !this.externalizable) {
- this.deserializeEx = new InvalidClassException(this.localDesc.name, "class invalid for deserialization");
- }
- }
-
- this.cons = this.localDesc.cons;
- this.writeObjectMethod = this.localDesc.writeObjectMethod;
- this.readObjectMethod = this.localDesc.readObjectMethod;
- this.readObjectNoDataMethod = this.localDesc.readObjectNoDataMethod;
- this.writeReplaceMethod = this.localDesc.writeReplaceMethod;
- this.readResolveMethod = this.localDesc.readResolveMethod;
- if (this.deserializeEx == null) {
- this.deserializeEx = this.localDesc.deserializeEx;
- }
- }
-
- this.fieldRefl = getReflector(this.fields, this.localDesc);
- this.fields = this.fieldRefl.getFields();
- }
-
- void readNonProxy(ObjectInputStream var1) throws IOException, ClassNotFoundException {
- this.name = var1.readUTF();
- this.suid = var1.readLong();
- this.isProxy = false;
- byte var2 = var1.readByte();
- this.hasWriteObjectData = (var2 & 1) != 0;
- this.hasBlockExternalData = (var2 & 8) != 0;
- this.externalizable = (var2 & 4) != 0;
- boolean var3 = (var2 & 2) != 0;
- if (this.externalizable && var3) {
- throw new InvalidClassException(this.name, "serializable and externalizable flags conflict");
- } else {
- this.serializable = this.externalizable || var3;
- this.isEnum = (var2 & 16) != 0;
- if (this.isEnum && this.suid != 0L) {
- throw new InvalidClassException(this.name, "enum descriptor has non-zero serialVersionUID: " + this.suid);
- } else {
- short var4 = var1.readShort();
- if (this.isEnum && var4 != 0) {
- throw new InvalidClassException(this.name, "enum descriptor has non-zero field count: " + var4);
- } else {
- this.fields = var4 > 0 ? new ObjectStreamField[var4] : NO_FIELDS;
-
- for(int var5 = 0; var5 < var4; ++var5) {
- char var6 = (char)var1.readByte();
- String var7 = var1.readUTF();
- String var8 = var6 != 'L' && var6 != '[' ? new String(new char[]{var6}) : var1.readTypeString();
-
- try {
- this.fields[var5] = new ObjectStreamField(var7, var8, false);
- } catch (RuntimeException var10) {
- throw (IOException)(new InvalidClassException(this.name, "invalid descriptor for field " + var7)).initCause(var10);
- }
- }
-
- this.computeFieldOffsets();
- }
- }
- }
- }
-
- void writeNonProxy(ObjectOutputStream var1) throws IOException {
- var1.writeUTF(this.name);
- var1.writeLong(this.getSerialVersionUID());
- byte var2 = 0;
- if (this.externalizable) {
- var2 = (byte)(var2 | 4);
- int var3 = var1.getProtocolVersion();
- if (var3 != 1) {
- var2 = (byte)(var2 | 8);
- }
- } else if (this.serializable) {
- var2 = (byte)(var2 | 2);
- }
-
- if (this.hasWriteObjectData) {
- var2 = (byte)(var2 | 1);
- }
-
- if (this.isEnum) {
- var2 = (byte)(var2 | 16);
- }
-
- var1.writeByte(var2);
- var1.writeShort(this.fields.length);
-
- for(int var5 = 0; var5 < this.fields.length; ++var5) {
- ObjectStreamField var4 = this.fields[var5];
- var1.writeByte(var4.getTypeCode());
- var1.writeUTF(var4.getName());
- if (!var4.isPrimitive()) {
- var1.writeTypeString(var4.getTypeString());
- }
- }
-
- }
-
- ClassNotFoundException getResolveException() {
- return this.resolveEx;
- }
-
- void checkDeserialize() throws InvalidClassException {
- if (this.deserializeEx != null) {
- InvalidClassException var1 = new InvalidClassException(this.deserializeEx.classname, this.deserializeEx.getMessage());
- var1.initCause(this.deserializeEx);
- throw var1;
- }
- }
-
- void checkSerialize() throws InvalidClassException {
- if (this.serializeEx != null) {
- InvalidClassException var1 = new InvalidClassException(this.serializeEx.classname, this.serializeEx.getMessage());
- var1.initCause(this.serializeEx);
- throw var1;
- }
- }
-
- void checkDefaultSerialize() throws InvalidClassException {
- if (this.defaultSerializeEx != null) {
- InvalidClassException var1 = new InvalidClassException(this.defaultSerializeEx.classname, this.defaultSerializeEx.getMessage());
- var1.initCause(this.defaultSerializeEx);
- throw var1;
- }
- }
-
- ObjectStreamClass getSuperDesc() {
- return this.superDesc;
- }
-
- ObjectStreamClass getLocalDesc() {
- return this.localDesc;
- }
-
- ObjectStreamField[] getFields(boolean var1) {
- return var1 ? (ObjectStreamField[])((ObjectStreamField[])this.fields.clone()) : this.fields;
- }
-
- ObjectStreamField getField(String var1, Class var2) {
- for(int var3 = 0; var3 < this.fields.length; ++var3) {
- ObjectStreamField var4 = this.fields[var3];
- if (var4.getName().equals(var1)) {
- if (var2 == null || var2 == Object.class && !var4.isPrimitive()) {
- return var4;
- }
-
- Class var5 = var4.getType();
- if (var5 != null && var2.isAssignableFrom(var5)) {
- return var4;
- }
- }
- }
-
- return null;
- }
-
- boolean isProxy() {
- return this.isProxy;
- }
-
- boolean isEnum() {
- return this.isEnum;
- }
-
- boolean isExternalizable() {
- return this.externalizable;
- }
-
- boolean isSerializable() {
- return this.serializable;
- }
-
- boolean hasBlockExternalData() {
- return this.hasBlockExternalData;
- }
-
- boolean hasWriteObjectData() {
- return this.hasWriteObjectData;
- }
-
- boolean isInstantiable() {
- return this.cons != null;
- }
-
- boolean hasWriteObjectMethod() {
- return this.writeObjectMethod != null;
- }
-
- boolean hasReadObjectMethod() {
- return this.readObjectMethod != null;
- }
-
- boolean hasReadObjectNoDataMethod() {
- return this.readObjectNoDataMethod != null;
- }
-
- boolean hasWriteReplaceMethod() {
- return this.writeReplaceMethod != null;
- }
-
- boolean hasReadResolveMethod() {
- return this.readResolveMethod != null;
- }
-
- Object newInstance() throws InstantiationException, InvocationTargetException, UnsupportedOperationException {
- if (this.cons != null) {
- try {
- return this.cons.newInstance();
- } catch (IllegalAccessException var2) {
- throw new InternalError();
- }
- } else {
- throw new UnsupportedOperationException();
- }
- }
-
- void invokeWriteObject(Object var1, ObjectOutputStream var2) throws IOException, UnsupportedOperationException {
- if (this.writeObjectMethod != null) {
- try {
- this.writeObjectMethod.invoke(var1, var2);
- } catch (InvocationTargetException var5) {
- Throwable var4 = var5.getTargetException();
- if (var4 instanceof IOException) {
- throw (IOException)var4;
- }
-
- throwMiscException(var4);
- } catch (IllegalAccessException var6) {
- throw new InternalError();
- }
-
- } else {
- throw new UnsupportedOperationException();
- }
- }
-
- void invokeReadObject(Object var1, ObjectInputStream var2) throws ClassNotFoundException, IOException, UnsupportedOperationException {
- if (this.readObjectMethod != null) {
- try {
- this.readObjectMethod.invoke(var1, var2);
- } catch (InvocationTargetException var5) {
- Throwable var4 = var5.getTargetException();
- if (var4 instanceof ClassNotFoundException) {
- throw (ClassNotFoundException)var4;
- }
-
- if (var4 instanceof IOException) {
- throw (IOException)var4;
- }
-
- throwMiscException(var4);
- } catch (IllegalAccessException var6) {
- throw new InternalError();
- }
-
- } else {
- throw new UnsupportedOperationException();
- }
- }
-
- void invokeReadObjectNoData(Object var1) throws IOException, UnsupportedOperationException {
- if (this.readObjectNoDataMethod != null) {
- try {
- this.readObjectNoDataMethod.invoke(var1, (Object[])null);
- } catch (InvocationTargetException var4) {
- Throwable var3 = var4.getTargetException();
- if (var3 instanceof ObjectStreamException) {
- throw (ObjectStreamException)var3;
- }
-
- throwMiscException(var3);
- } catch (IllegalAccessException var5) {
- throw new InternalError();
- }
-
- } else {
- throw new UnsupportedOperationException();
- }
- }
-
- Object invokeWriteReplace(Object var1) throws IOException, UnsupportedOperationException {
- if (this.writeReplaceMethod != null) {
- try {
- return this.writeReplaceMethod.invoke(var1, (Object[])null);
- } catch (InvocationTargetException var4) {
- Throwable var3 = var4.getTargetException();
- if (var3 instanceof ObjectStreamException) {
- throw (ObjectStreamException)var3;
- } else {
- throwMiscException(var3);
- throw new InternalError();
- }
- } catch (IllegalAccessException var5) {
- throw new InternalError();
- }
- } else {
- throw new UnsupportedOperationException();
- }
- }
-
- Object invokeReadResolve(Object var1) throws IOException, UnsupportedOperationException {
- if (this.readResolveMethod != null) {
- try {
- return this.readResolveMethod.invoke(var1, (Object[])null);
- } catch (InvocationTargetException var4) {
- Throwable var3 = var4.getTargetException();
- if (var3 instanceof ObjectStreamException) {
- throw (ObjectStreamException)var3;
- } else {
- throwMiscException(var3);
- throw new InternalError();
- }
- } catch (IllegalAccessException var5) {
- throw new InternalError();
- }
- } else {
- throw new UnsupportedOperationException();
- }
- }
-
- ClassDataSlot[] getClassDataLayout() throws InvalidClassException {
- if (this.dataLayout == null) {
- this.dataLayout = this.getClassDataLayout0();
- }
-
- return this.dataLayout;
- }
-
- private ClassDataSlot[] getClassDataLayout0() throws InvalidClassException {
- ArrayList var1 = new ArrayList();
- Class var2 = this.field_0;
-
- Class var3;
- for(var3 = this.field_0; var3 != null && Serializable.class.isAssignableFrom(var3); var3 = var3.getSuperclass()) {
- }
-
- for(ObjectStreamClass var4 = this; var4 != null; var4 = var4.superDesc) {
- String var5 = var4.field_0 != null ? var4.field_0.getName() : var4.name;
- Class var6 = null;
-
- for(Class var7 = var2; var7 != var3; var7 = var7.getSuperclass()) {
- if (var5.equals(var7.getName())) {
- var6 = var7;
- break;
- }
- }
-
- if (var6 != null) {
- for(Class var9 = var2; var9 != var6; var9 = var9.getSuperclass()) {
- var1.add(new ClassDataSlot(lookup(var9, true), false));
- }
-
- var2 = var6.getSuperclass();
- }
-
- var1.add(new ClassDataSlot(var4.getVariantFor(var6), true));
- }
-
- for(Class var8 = var2; var8 != var3; var8 = var8.getSuperclass()) {
- var1.add(new ClassDataSlot(lookup(var8, true), false));
- }
-
- Collections.reverse(var1);
- return (ClassDataSlot[])var1.toArray(new ClassDataSlot[var1.size()]);
- }
-
- int getPrimDataSize() {
- return this.primDataSize;
- }
-
- int getNumObjFields() {
- return this.numObjFields;
- }
-
- void getPrimFieldValues(Object var1, byte[] var2) {
- this.fieldRefl.getPrimFieldValues(var1, var2);
- }
-
- void setPrimFieldValues(Object var1, byte[] var2) {
- this.fieldRefl.setPrimFieldValues(var1, var2);
- }
-
- void getObjFieldValues(Object var1, Object[] var2) {
- this.fieldRefl.getObjFieldValues(var1, var2);
- }
-
- void setObjFieldValues(Object var1, Object[] var2) {
- this.fieldRefl.setObjFieldValues(var1, var2);
- }
-
- private void computeFieldOffsets() throws InvalidClassException {
- this.primDataSize = 0;
- this.numObjFields = 0;
- int var1 = -1;
-
- for(int var2 = 0; var2 < this.fields.length; ++var2) {
- ObjectStreamField var3 = this.fields[var2];
- switch (var3.getTypeCode()) {
- case 'B':
- case 'Z':
- var3.setOffset(this.primDataSize++);
- break;
- case 'C':
- case 'S':
- var3.setOffset(this.primDataSize);
- this.primDataSize += 2;
- break;
- case 'D':
- case 'J':
- var3.setOffset(this.primDataSize);
- this.primDataSize += 8;
- break;
- case 'E':
- case 'G':
- case 'H':
- case 'K':
- case 'M':
- case 'N':
- case 'O':
- case 'P':
- case 'Q':
- case 'R':
- case 'T':
- case 'U':
- case 'V':
- case 'W':
- case 'X':
- case 'Y':
- default:
- throw new InternalError();
- case 'F':
- case 'I':
- var3.setOffset(this.primDataSize);
- this.primDataSize += 4;
- break;
- case 'L':
- case '[':
- var3.setOffset(this.numObjFields++);
- if (var1 == -1) {
- var1 = var2;
- }
- }
- }
-
- if (var1 != -1 && var1 + this.numObjFields != this.fields.length) {
- throw new InvalidClassException(this.name, "illegal field order");
- }
- }
-
- private ObjectStreamClass getVariantFor(Class var1) throws InvalidClassException {
- if (this.field_0 == var1) {
- return this;
- } else {
- ObjectStreamClass var2 = new ObjectStreamClass();
- if (this.isProxy) {
- var2.initProxy(var1, (ClassNotFoundException)null, this.superDesc);
- } else {
- var2.initNonProxy(this, var1, (ClassNotFoundException)null, this.superDesc);
- }
-
- return var2;
- }
- }
-
- private static Constructor getExternalizableConstructor(Class var0) {
- try {
- Constructor var1 = var0.getDeclaredConstructor((Class[])null);
- var1.setAccessible(true);
- return (var1.getModifiers() & 1) != 0 ? var1 : null;
- } catch (NoSuchMethodException var2) {
- return null;
- }
- }
-
- private static Constructor getSerializableConstructor(Class var0) {
- Class var1 = var0;
-
- while(Serializable.class.isAssignableFrom(var1)) {
- if ((var1 = var1.getSuperclass()) == null) {
- return null;
- }
- }
-
- try {
- Constructor var2 = var1.getDeclaredConstructor((Class[])null);
- int var3 = var2.getModifiers();
- if ((var3 & 2) == 0 && ((var3 & 5) != 0 || packageEquals(var0, var1))) {
- var2 = reflFactory.newConstructorForSerialization(var0, var2);
- var2.setAccessible(true);
- return var2;
- } else {
- return null;
- }
- } catch (NoSuchMethodException var4) {
- return null;
- }
- }
-
- private static Method getInheritableMethod(Class var0, String var1, Class[] var2, Class var3) {
- Method var4 = null;
-
- Class var5;
- for(var5 = var0; var5 != null; var5 = var5.getSuperclass()) {
- try {
- var4 = var5.getDeclaredMethod(var1, var2);
- break;
- }
- }
-
- if (var4 != null && var4.getReturnType() == var3) {
- var4.setAccessible(true);
- int var6 = var4.getModifiers();
- if ((var6 & 1032) != 0) {
- return null;
- } else if ((var6 & 5) != 0) {
- return var4;
- } else if ((var6 & 2) != 0) {
- return var0 == var5 ? var4 : null;
- } else {
- return packageEquals(var0, var5) ? var4 : null;
- }
- } else {
- return null;
- }
- }
-
- private static Method getPrivateMethod(Class var0, String var1, Class[] var2, Class var3) {
- try {
- Method var4 = var0.getDeclaredMethod(var1, var2);
- var4.setAccessible(true);
- int var5 = var4.getModifiers();
- return var4.getReturnType() == var3 && (var5 & 8) == 0 && (var5 & 2) != 0 ? var4 : null;
- } catch (NoSuchMethodException var6) {
- return null;
- }
- }
-
- private static boolean packageEquals(Class var0, Class var1) {
- return var0.getClassLoader() == var1.getClassLoader() && getPackageName(var0).equals(getPackageName(var1));
- }
-
- private static String getPackageName(Class var0) {
- String var1 = var0.getName();
- int var2 = var1.lastIndexOf(91);
- if (var2 >= 0) {
- var1 = var1.substring(var2 + 2);
- }
-
- var2 = var1.lastIndexOf(46);
- return var2 >= 0 ? var1.substring(0, var2) : "";
- }
-
- private static boolean classNamesEqual(String var0, String var1) {
- var0 = var0.substring(var0.lastIndexOf(46) + 1);
- var1 = var1.substring(var1.lastIndexOf(46) + 1);
- return var0.equals(var1);
- }
-
- static String getClassSignature(Class var0) {
- StringBuilder var1;
- for(var1 = new StringBuilder(); var0.isArray(); var0 = var0.getComponentType()) {
- var1.append('[');
- }
-
- if (var0.isPrimitive()) {
- if (var0 == Integer.TYPE) {
- var1.append('I');
- } else if (var0 == Byte.TYPE) {
- var1.append('B');
- } else if (var0 == Long.TYPE) {
- var1.append('J');
- } else if (var0 == Float.TYPE) {
- var1.append('F');
- } else if (var0 == Double.TYPE) {
- var1.append('D');
- } else if (var0 == Short.TYPE) {
- var1.append('S');
- } else if (var0 == Character.TYPE) {
- var1.append('C');
- } else if (var0 == Boolean.TYPE) {
- var1.append('Z');
- } else {
- if (var0 != Void.TYPE) {
- throw new InternalError();
- }
-
- var1.append('V');
- }
- } else {
- var1.append('L' + var0.getName().replace('.', '/') + ';');
- }
-
- return var1.toString();
- }
-
- private static String getMethodSignature(Class[] var0, Class var1) {
- StringBuilder var2 = new StringBuilder();
- var2.append('(');
-
- for(int var3 = 0; var3 < var0.length; ++var3) {
- var2.append(getClassSignature(var0[var3]));
- }
-
- var2.append(')');
- var2.append(getClassSignature(var1));
- return var2.toString();
- }
-
- private static void throwMiscException(Throwable var0) throws IOException {
- if (var0 instanceof RuntimeException) {
- throw (RuntimeException)var0;
- } else if (var0 instanceof Error) {
- throw (Error)var0;
- } else {
- IOException var1 = new IOException("unexpected exception type");
- var1.initCause(var0);
- throw var1;
- }
- }
-
- private static ObjectStreamField[] getSerialFields(Class var0) throws InvalidClassException {
- ObjectStreamField[] var1;
- if (Serializable.class.isAssignableFrom(var0) && !Externalizable.class.isAssignableFrom(var0) && !Proxy.isProxyClass(var0) && !var0.isInterface()) {
- if ((var1 = getDeclaredSerialFields(var0)) == null) {
- var1 = getDefaultSerialFields(var0);
- }
-
- Arrays.sort(var1);
- } else {
- var1 = NO_FIELDS;
- }
-
- return var1;
- }
-
- private static ObjectStreamField[] getDeclaredSerialFields(Class var0) throws InvalidClassException {
- ObjectStreamField[] var1 = null;
-
- try {
- Field var2 = var0.getDeclaredField("serialPersistentFields");
- byte var3 = 26;
- if ((var2.getModifiers() & var3) == var3) {
- var2.setAccessible(true);
- var1 = (ObjectStreamField[])var2.get((Object)null);
- }
- } catch (Exception var9) {
- }
-
- if (var1 == null) {
- return null;
- } else if (var1.length == 0) {
- return NO_FIELDS;
- } else {
- ObjectStreamField[] var10 = new ObjectStreamField[var1.length];
- HashSet var11 = new HashSet(var1.length);
-
- for(int var4 = 0; var4 < var1.length; ++var4) {
- ObjectStreamField var5 = var1[var4];
- String var6 = var5.getName();
- if (var11.contains(var6)) {
- throw new InvalidClassException("multiple serializable fields named " + var6);
- }
-
- var11.add(var6);
-
- try {
- Field var7 = var0.getDeclaredField(var6);
- if (var7.getType() == var5.getType() && (var7.getModifiers() & 8) == 0) {
- var10[var4] = new ObjectStreamField(var7, var5.isUnshared(), true);
- }
- } catch (NoSuchFieldException var8) {
- }
-
- if (var10[var4] == null) {
- var10[var4] = new ObjectStreamField(var6, var5.getType(), var5.isUnshared());
- }
- }
-
- return var10;
- }
- }
-
- private static ObjectStreamField[] getDefaultSerialFields(Class var0) {
- Field[] var1 = var0.getDeclaredFields();
- ArrayList var2 = new ArrayList();
- short var3 = 136;
-
- for(int var4 = 0; var4 < var1.length; ++var4) {
- if ((var1[var4].getModifiers() & var3) == 0) {
- var2.add(new ObjectStreamField(var1[var4], false, true));
- }
- }
-
- int var5 = var2.size();
- return var5 == 0 ? NO_FIELDS : (ObjectStreamField[])((ObjectStreamField[])var2.toArray(new ObjectStreamField[var5]));
- }
-
- private static Long getDeclaredSUID(Class var0) {
- try {
- Field var1 = var0.getDeclaredField("serialVersionUID");
- byte var2 = 24;
- if ((var1.getModifiers() & var2) == var2) {
- var1.setAccessible(true);
- return var1.getLong((Object)null);
- }
- } catch (Exception var3) {
- }
-
- return null;
- }
-
- private static long computeDefaultSUID(Class var0) {
- if (Serializable.class.isAssignableFrom(var0) && !Proxy.isProxyClass(var0)) {
- try {
- ByteArrayOutputStream var1 = new ByteArrayOutputStream();
- DataOutputStream var2 = new DataOutputStream(var1);
- var2.writeUTF(var0.getName());
- int var3 = var0.getModifiers() & 1553;
- Method[] var4 = var0.getDeclaredMethods();
- if ((var3 & 512) != 0) {
- var3 = var4.length > 0 ? var3 | 1024 : var3 & -1025;
- }
-
- var2.writeInt(var3);
- if (!var0.isArray()) {
- Class[] var5 = var0.getInterfaces();
- String[] var6 = new String[var5.length];
-
- for(int var7 = 0; var7 < var5.length; ++var7) {
- var6[var7] = var5[var7].getName();
- }
-
- Arrays.sort(var6);
-
- for(int var19 = 0; var19 < var6.length; ++var19) {
- var2.writeUTF(var6[var19]);
- }
- }
-
- Field[] var17 = var0.getDeclaredFields();
- MemberSignature[] var18 = new MemberSignature[var17.length];
-
- for(int var20 = 0; var20 < var17.length; ++var20) {
- var18[var20] = new MemberSignature(var17[var20]);
- }
-
- Arrays.sort(var18, new 3());
-
- for(int var21 = 0; var21 < var18.length; ++var21) {
- MemberSignature var8 = var18[var21];
- int var9 = var8.member.getModifiers() & 223;
- if ((var9 & 2) == 0 || (var9 & 136) == 0) {
- var2.writeUTF(var8.name);
- var2.writeInt(var9);
- var2.writeUTF(var8.signature);
- }
- }
-
- if (hasStaticInitializer(var0)) {
- var2.writeUTF("<clinit>");
- var2.writeInt(8);
- var2.writeUTF("()V");
- }
-
- Constructor[] var22 = var0.getDeclaredConstructors();
- MemberSignature[] var23 = new MemberSignature[var22.length];
-
- for(int var24 = 0; var24 < var22.length; ++var24) {
- var23[var24] = new MemberSignature(var22[var24]);
- }
-
- Arrays.sort(var23, new 4());
-
- for(int var25 = 0; var25 < var23.length; ++var25) {
- MemberSignature var10 = var23[var25];
- int var11 = var10.member.getModifiers() & 3391;
- if ((var11 & 2) == 0) {
- var2.writeUTF("<init>");
- var2.writeInt(var11);
- var2.writeUTF(var10.signature.replace('/', '.'));
- }
- }
-
- MemberSignature[] var26 = new MemberSignature[var4.length];
-
- for(int var27 = 0; var27 < var4.length; ++var27) {
- var26[var27] = new MemberSignature(var4[var27]);
- }
-
- Arrays.sort(var26, new 5());
-
- for(int var28 = 0; var28 < var26.length; ++var28) {
- MemberSignature var30 = var26[var28];
- int var12 = var30.member.getModifiers() & 3391;
- if ((var12 & 2) == 0) {
- var2.writeUTF(var30.name);
- var2.writeInt(var12);
- var2.writeUTF(var30.signature.replace('/', '.'));
- }
- }
-
- var2.flush();
- MessageDigest var29 = MessageDigest.getInstance("SHA");
- byte[] var31 = var29.digest(var1.toByteArray());
- long var32 = 0L;
-
- for(int var14 = Math.min(var31.length, 8) - 1; var14 >= 0; --var14) {
- var32 = var32 << 8 | (long)(var31[var14] & 255);
- }
-
- return var32;
- } catch (IOException var15) {
- throw new InternalError();
- } catch (NoSuchAlgorithmException var16) {
- throw new SecurityException(var16.getMessage());
- }
- } else {
- return 0L;
- }
- }
-
- private static native boolean hasStaticInitializer(Class var0);
-
- private static FieldReflector getReflector(ObjectStreamField[] var0, ObjectStreamClass var1) throws InvalidClassException {
- Class var2 = var1 != null && var0.length > 0 ? var1.field_0 : null;
- processQueue(java.io.ObjectStreamClass.Caches.access$2500(), java.io.ObjectStreamClass.Caches.reflectors);
- FieldReflectorKey var3 = new FieldReflectorKey(var2, var0, java.io.ObjectStreamClass.Caches.access$2500());
- Reference var4 = (Reference)java.io.ObjectStreamClass.Caches.reflectors.get(var3);
- Object var5 = null;
- if (var4 != null) {
- var5 = var4.get();
- }
-
- EntryFuture var6 = null;
- if (var5 == null) {
- EntryFuture var7 = new EntryFuture((1)null);
- SoftReference var8 = new SoftReference(var7);
-
- do {
- if (var4 != null) {
- java.io.ObjectStreamClass.Caches.reflectors.remove(var3, var4);
- }
-
- var4 = (Reference)java.io.ObjectStreamClass.Caches.reflectors.putIfAbsent(var3, var8);
- if (var4 != null) {
- var5 = var4.get();
- }
- } while(var4 != null && var5 == null);
-
- if (var5 == null) {
- var6 = var7;
- }
- }
-
- if (var5 instanceof FieldReflector) {
- return (FieldReflector)var5;
- } else {
- if (var5 instanceof EntryFuture) {
- var5 = ((EntryFuture)var5).get();
- } else if (var5 == null) {
- try {
- var5 = new FieldReflector(matchFields(var0, var1));
- } catch (Throwable var9) {
- var5 = var9;
- }
-
- var6.set(var5);
- java.io.ObjectStreamClass.Caches.reflectors.put(var3, new SoftReference(var5));
- }
-
- if (var5 instanceof FieldReflector) {
- return (FieldReflector)var5;
- } else if (var5 instanceof InvalidClassException) {
- throw (InvalidClassException)var5;
- } else if (var5 instanceof RuntimeException) {
- throw (RuntimeException)var5;
- } else if (var5 instanceof Error) {
- throw (Error)var5;
- } else {
- throw new InternalError("unexpected entry: " + var5);
- }
- }
- }
-
- private static ObjectStreamField[] matchFields(ObjectStreamField[] var0, ObjectStreamClass var1) throws InvalidClassException {
- ObjectStreamField[] var2 = var1 != null ? var1.fields : NO_FIELDS;
- ObjectStreamField[] var3 = new ObjectStreamField[var0.length];
-
- for(int var4 = 0; var4 < var0.length; ++var4) {
- ObjectStreamField var5 = var0[var4];
- ObjectStreamField var6 = null;
-
- for(int var7 = 0; var7 < var2.length; ++var7) {
- ObjectStreamField var8 = var2[var7];
- if (var5.getName().equals(var8.getName())) {
- if ((var5.isPrimitive() || var8.isPrimitive()) && var5.getTypeCode() != var8.getTypeCode()) {
- throw new InvalidClassException(var1.name, "incompatible types for field " + var5.getName());
- }
-
- if (var8.getField() != null) {
- var6 = new ObjectStreamField(var8.getField(), var8.isUnshared(), false);
- } else {
- var6 = new ObjectStreamField(var8.getName(), var8.getSignature(), var8.isUnshared());
- }
- }
- }
-
- if (var6 == null) {
- var6 = new ObjectStreamField(var5.getName(), var5.getSignature(), false);
- }
-
- var6.setOffset(var5.getOffset());
- var3[var4] = var6;
- }
-
- return var3;
- }
-
- static void processQueue(ReferenceQueue<Class<?>> var0, ConcurrentMap<? extends WeakReference<Class<?>>, ?> var1) {
- Reference var2;
- while((var2 = var0.poll()) != null) {
- var1.remove(var2);
- }
-
- }
-
- // $FF: synthetic method
- static Class access$000(ObjectStreamClass var0) {
- return var0.field_0;
- }
-
- // $FF: synthetic method
- static long access$100(Class var0) {
- return computeDefaultSUID(var0);
- }
-
- // $FF: synthetic method
- static boolean access$400(ObjectStreamClass var0) {
- return var0.isEnum;
- }
-
- // $FF: synthetic method
- static Long access$502(ObjectStreamClass var0, Long var1) {
- return var0.suid = var1;
- }
-
- // $FF: synthetic method
- static ObjectStreamField[] access$602(ObjectStreamClass var0, ObjectStreamField[] var1) {
- return var0.fields = var1;
- }
-
- // $FF: synthetic method
- static Long access$700(Class var0) {
- return getDeclaredSUID(var0);
- }
-
- // $FF: synthetic method
- static ObjectStreamField[] access$800(Class var0) throws InvalidClassException {
- return getSerialFields(var0);
- }
-
- // $FF: synthetic method
- static void access$900(ObjectStreamClass var0) throws InvalidClassException {
- var0.computeFieldOffsets();
- }
-
- // $FF: synthetic method
- static InvalidClassException access$1002(ObjectStreamClass var0, InvalidClassException var1) {
- return var0.serializeEx = var1;
- }
-
- // $FF: synthetic method
- static InvalidClassException access$1102(ObjectStreamClass var0, InvalidClassException var1) {
- return var0.deserializeEx = var1;
- }
-
- // $FF: synthetic method
- static boolean access$1200(ObjectStreamClass var0) {
- return var0.externalizable;
- }
-
- // $FF: synthetic method
- static Constructor access$1302(ObjectStreamClass var0, Constructor var1) {
- return var0.cons = var1;
- }
-
- // $FF: synthetic method
- static Constructor access$1400(Class var0) {
- return getExternalizableConstructor(var0);
- }
-
- // $FF: synthetic method
- static Constructor access$1500(Class var0) {
- return getSerializableConstructor(var0);
- }
-
- // $FF: synthetic method
- static Method access$1602(ObjectStreamClass var0, Method var1) {
- return var0.writeObjectMethod = var1;
- }
-
- // $FF: synthetic method
- static Method access$1700(Class var0, String var1, Class[] var2, Class var3) {
- return getPrivateMethod(var0, var1, var2, var3);
- }
-
- // $FF: synthetic method
- static Method access$1802(ObjectStreamClass var0, Method var1) {
- return var0.readObjectMethod = var1;
- }
-
- // $FF: synthetic method
- static Method access$1902(ObjectStreamClass var0, Method var1) {
- return var0.readObjectNoDataMethod = var1;
- }
-
- // $FF: synthetic method
- static boolean access$2002(ObjectStreamClass var0, boolean var1) {
- return var0.hasWriteObjectData = var1;
- }
-
- // $FF: synthetic method
- static Method access$1600(ObjectStreamClass var0) {
- return var0.writeObjectMethod;
- }
-
- // $FF: synthetic method
- static Method access$2102(ObjectStreamClass var0, Method var1) {
- return var0.writeReplaceMethod = var1;
- }
-
- // $FF: synthetic method
- static Method access$2200(Class var0, String var1, Class[] var2, Class var3) {
- return getInheritableMethod(var0, var1, var2, var3);
- }
-
- // $FF: synthetic method
- static Method access$2302(ObjectStreamClass var0, Method var1) {
- return var0.readResolveMethod = var1;
- }
-
- // $FF: synthetic method
- static String access$2400(Class[] var0, Class var1) {
- return getMethodSignature(var0, var1);
- }
-
- static {
- serialPersistentFields = NO_FIELDS;
- reflFactory = (ReflectionFactory)AccessController.doPrivileged(new ReflectionFactory.GetReflectionFactoryAction());
- initNative();
- }
- }
-