diff options
author | Jeroen Frijters <jeroen@frijters.net> | 2004-09-24 09:05:10 +0000 |
---|---|---|
committer | Michael Koch <mkoch@gcc.gnu.org> | 2004-09-24 09:05:10 +0000 |
commit | 73eb130916f39f689a0c6089e4ee699d89f85907 (patch) | |
tree | fafed187ed98f844353a70527ed246a64b37301c /libjava/java/io/ObjectStreamClass.java | |
parent | 8ac4bd37068ea73ca55ebeaba16ec72709f0d617 (diff) | |
download | gcc-73eb130916f39f689a0c6089e4ee699d89f85907.zip gcc-73eb130916f39f689a0c6089e4ee699d89f85907.tar.gz gcc-73eb130916f39f689a0c6089e4ee699d89f85907.tar.bz2 |
ObjectInputStream.java (readObject): Delegate instantation of Externalizable classes to ObjectStreamClass.
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.
From-SVN: r88019
Diffstat (limited to 'libjava/java/io/ObjectStreamClass.java')
-rw-r--r-- | libjava/java/io/ObjectStreamClass.java | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/libjava/java/io/ObjectStreamClass.java b/libjava/java/io/ObjectStreamClass.java index 08576cd..050ed3d 100644 --- a/libjava/java/io/ObjectStreamClass.java +++ b/libjava/java/io/ObjectStreamClass.java @@ -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; |