RFR [9] 8071472: Add field setter API for setting final fields in readObject
Peter Levart
peter.levart at gmail.com
Wed Mar 25 12:24:00 UTC 2015
On 03/23/2015 04:45 PM, Chris Hegarty wrote:
> Here is an updated version of the FieldSetter API, with all comments
> to date incorporated.
>
>
> http://cr.openjdk.java.net/~chegar/8071472/02/specdiff/overview-summary.html
>
>
> Final spec comments welcome, after which I intend to submit a CCC
> request.
>
> -Chris.
Hi Chris,
Recent bug "JDK-8068721 - RMI-IIOP communication fails when
ConcurrentHashMap is passed to remote method" made me thinking...
ObjectInputStream is an extensible API. There are subclasses of
ObjectInputStream out there. For example, there is an abstract
"com.sun.corba.se.impl.io.InputStreamHook" with concrete implementation
"com.sun.corba.se.impl.io.IIOPInputStream". The InputStreamHook
overrides ObjectInputStream.defaultReadObject() with it's own
implementation which doesn call ObjectInputStream.defaultReadObject(),
which means that FieldSetterContext.checkPersistentFinalsNotSet() and
FieldSetterContext.markPersistentFinalsSet() is not called for
InputStreamHook based subclasses when user's readObject() calls
defaultReadObject(), which further means that
FieldSetter.checkAllFinalsSet() that is eventually called as last thing
in user's readObject() method might find any persistent finals as not
set and throw InvalidObjectException.
I have been thinking about this and I see several solutions:
1. provide protected final methods
ObjectInputStream.checkPersistentFinalsNotSet() and
markPersistentFinalsSet() that just delegate to FieldSetterContext for
ObjectInputStream classes to call as part of their own overriden
defaultReadObject() method. We should make sure those methods are called
in JDK's corba InputStreamHook and document they should be called in 3rd
party subclasses.
2. in ObjectInputStream constructor, detect if defaultReadObject() is
overridden and set a flag that makes FieldSetter.checkAllFinalsSet()
effectively a no-op.
3. 1 + 2 + enable for ObjectInputStream subclasses to declare that they
obey the contract and that they call markPersistentFinalsSet() from
overridden defaultReadObject() so checkAllFinalsSet() can be enabled.
What do you think?
Regards, Peter
More information about the core-libs-dev
mailing list