diff options
Diffstat (limited to 'libjava/java/io/ObjectOutputStream.java')
-rw-r--r-- | libjava/java/io/ObjectOutputStream.java | 62 |
1 files changed, 20 insertions, 42 deletions
diff --git a/libjava/java/io/ObjectOutputStream.java b/libjava/java/io/ObjectOutputStream.java index 3482225..55763ee 100644 --- a/libjava/java/io/ObjectOutputStream.java +++ b/libjava/java/io/ObjectOutputStream.java @@ -250,6 +250,11 @@ public class ObjectOutputStream extends OutputStream break; } + Class clazz = obj.getClass(); + ObjectStreamClass osc = ObjectStreamClass.lookupForClassObject(clazz); + if (osc == null) + throw new NotSerializableException(clazz.getName()); + if ((replacementEnabled || obj instanceof Serializable) && ! replaceDone) { @@ -257,19 +262,11 @@ public class ObjectOutputStream extends OutputStream if (obj instanceof Serializable) { - Method m = null; try { - Class classArgs[] = {}; - m = getMethod(obj.getClass(), "writeReplace", - classArgs); - // m can't be null by definition since an - // exception would have been thrown so a check - // for null is not needed. - obj = m.invoke(obj, new Object[] {}); - } - catch (NoSuchMethodException ignore) - { + Method m = osc.writeReplaceMethod; + if (m != null) + obj = m.invoke(obj, new Object[0]); } catch (IllegalAccessException ignore) { @@ -294,11 +291,6 @@ public class ObjectOutputStream extends OutputStream break; } - Class clazz = obj.getClass(); - ObjectStreamClass osc = ObjectStreamClass.lookupForClassObject(clazz); - if (osc == null) - throw new NotSerializableException(clazz.getName()); - if (clazz.isArray ()) { realOutput.writeByte(TC_ARRAY); @@ -347,8 +339,8 @@ public class ObjectOutputStream extends OutputStream fieldsAlreadyWritten = false; if (currentObjectStreamClass.hasWriteMethod()) { - if (dump) - dumpElementln ("WRITE METHOD CALLED FOR: " + obj); + if (dump) + dumpElementln ("WRITE METHOD CALLED FOR: " + obj); setBlockDataMode(true); callWriteMethod(obj, currentObjectStreamClass); setBlockDataMode(false); @@ -358,10 +350,10 @@ public class ObjectOutputStream extends OutputStream } else { - if (dump) - dumpElementln ("WRITE FIELDS CALLED FOR: " + obj); - writeFields(obj, currentObjectStreamClass); - } + if (dump) + dumpElementln ("WRITE FIELDS CALLED FOR: " + obj); + writeFields(obj, currentObjectStreamClass); + } } this.currentObject = prevObject; @@ -1261,18 +1253,11 @@ public class ObjectOutputStream extends OutputStream private void callWriteMethod(Object obj, ObjectStreamClass osc) throws IOException { - Class klass = osc.forClass(); currentPutField = null; try { - Class classArgs[] = {ObjectOutputStream.class}; - Method m = getMethod(klass, "writeObject", classArgs); - Object args[] = {this}; - m.invoke(obj, args); - } - catch (NoSuchMethodException nsme) - { - // Nothing. + Object args[] = {this}; + osc.writeObjectMethod.invoke(obj, args); } catch (InvocationTargetException x) { @@ -1285,7 +1270,8 @@ public class ObjectOutputStream extends OutputStream IOException ioe = new IOException("Exception thrown from writeObject() on " + - klass + ": " + exception.getClass().getName()); + osc.forClass().getName() + ": " + + exception.getClass().getName()); ioe.initCause(exception); throw ioe; } @@ -1293,7 +1279,8 @@ public class ObjectOutputStream extends OutputStream { IOException ioe = new IOException("Failure invoking writeObject() on " + - klass + ": " + x.getClass().getName()); + osc.forClass().getName() + ": " + + x.getClass().getName()); ioe.initCause(x); throw ioe; } @@ -1535,15 +1522,6 @@ public class ObjectOutputStream extends OutputStream } } - private Method getMethod (Class klass, String name, Class[] args) - throws java.lang.NoSuchMethodException - { - final Method m = klass.getDeclaredMethod(name, args); - setAccessible.setMember(m); - AccessController.doPrivileged(setAccessible); - return m; - } - private void dumpElementln (String msg) { for (int i = 0; i < depth; i++) |