OSDN Git Service

2004-09-24 Jeroen Frijters <jeroen@frijters.net>
authormkoch <mkoch@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 24 Sep 2004 09:05:10 +0000 (09:05 +0000)
committermkoch <mkoch@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 24 Sep 2004 09:05:10 +0000 (09:05 +0000)
* java/io/ObjectInputStream.java (readObject): Delegate instantation
of Externalizable classes to ObjectStreamClass.
* java/io/ObjectStreamClass.java (newInstance): New method to
instantiate Externalizable (while ignoring the accessibility of
the constructor). (constructor): New field to cache the constructor.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@88019 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/java/io/ObjectInputStream.java
libjava/java/io/ObjectStreamClass.java

index 1399a55..a6807ec 100644 (file)
@@ -1,3 +1,11 @@
+2004-09-24  Jeroen Frijters  <jeroen@frijters.net>
+
+       * java/io/ObjectInputStream.java (readObject): Delegate instantation
+       of Externalizable classes to ObjectStreamClass.
+       * java/io/ObjectStreamClass.java (newInstance): New method to
+       instantiate Externalizable (while ignoring the accessibility of
+       the constructor). (constructor): New field to cache the constructor.
+
 2004-09-24  Mark Wielaard  <mark@klomp.org>
 
        * java/net/URL.java (systemClassLoader): New static field.
index 809e9b1..b9bba27 100644 (file)
@@ -291,29 +291,7 @@ public class ObjectInputStream extends InputStream
              
              if (osc.realClassIsExternalizable)
                {
-                 Externalizable obj = null;
-                 
-                 try
-                   {
-                     obj = (Externalizable)clazz.newInstance();
-                   }
-                 catch (InstantiationException e)
-                   {
-                     throw new ClassNotFoundException
-                       ("Instance of " + clazz + " could not be created");
-                   }
-                 catch (IllegalAccessException e)
-                   {
-                     throw new ClassNotFoundException
-                       ("Instance of " + clazz + " could not be created because class or "
-                        + "zero-argument constructor is not accessible");
-                   }
-                 catch (NoSuchMethodError e)
-                   {
-                     throw new ClassNotFoundException
-                       ("Instance of " + clazz
-                        + " could not be created because zero-argument constructor is not defined");
-                   }
+                 Externalizable obj = osc.newInstance();
                  
                  int handle = assignNewHandle(obj);
                  
index 08576cd..050ed3d 100644 (file)
@@ -811,6 +811,54 @@ outer:
     return fieldsArray;
   }
 
+  /**
+   * Returns a new instance of the Class this ObjectStreamClass corresponds
+   * to.
+   * Note that this should only be used for Externalizable classes.
+   *
+   * @return A new instance.
+   */
+  Externalizable newInstance() throws InvalidClassException
+  {
+    synchronized(this)
+    {
+       if (constructor == null)
+       {
+           try
+           {
+               final Constructor c = clazz.getConstructor(new Class[0]);
+
+               AccessController.doPrivileged(new PrivilegedAction()
+               {
+                   public Object run()
+                   {
+                       c.setAccessible(true);
+                       return null;
+                   }
+               });
+
+               constructor = c;
+           }
+           catch(NoSuchMethodException x)
+           {
+               throw new InvalidClassException(clazz.getName(),
+                   "No public zero-argument constructor");
+           }
+       }
+    }
+
+    try
+    {
+       return (Externalizable)constructor.newInstance(null);
+    }
+    catch(Throwable t)
+    {
+       throw (InvalidClassException)
+           new InvalidClassException(clazz.getName(),
+                    "Unable to instantiate").initCause(t);
+    }
+  }
+
   public static final ObjectStreamField[] NO_FIELDS = {};
 
   private static Hashtable classLookupTable = new Hashtable();
@@ -840,6 +888,7 @@ outer:
   boolean realClassIsExternalizable;
   ObjectStreamField[] fieldMapping;
   Class firstNonSerializableParent;
+  private Constructor constructor;  // default constructor for Externalizable
 
   boolean isProxyClass = false;