JDK9 and Objenesis

forax at univ-mlv.fr forax at univ-mlv.fr
Fri Jan 13 19:45:43 UTC 2017


doh, 
sorry, miss you last bullet point. 

I wonder why it's slower than the ObjectStreamClassInstantiator ? 

Rémi 

> De: "Henri Tremblay" <henri.tremblay at gmail.com>
> À: "Remi Forax" <forax at univ-mlv.fr>
> Cc: "jdk9-dev" <jdk9-dev at openjdk.java.net>
> Envoyé: Vendredi 13 Janvier 2017 20:28:49
> Objet: Re: JDK9 and Objenesis

> What about it? This is the UnsafeFactoryInstantiator. It works. It is the
> default if Objenesis encounters an unknown JVM (because it is pretty much
> everywhere).

> On 13 January 2017 at 12:26, Remi Forax < forax at univ-mlv.fr > wrote:

>> And Unsafe.allocateInstance ??

>> Rémi

>> ----- Mail original -----
>> > De: "Henri Tremblay" < henri.tremblay at gmail.com >
>> > À: "jdk9-dev" < jdk9-dev at openjdk.java.net >
>> > Envoyé: Vendredi 13 Janvier 2017 16:41:22
>> > Objet: JDK9 and Objenesis

>> > Hi,

>> > I did a release of Objenesis yesterday to provide Java 9 (151 jigsaw)
>> > support. It has been on and off so far but the serialization part seemed to
>> > be permanently broken so I fixed it.

>> > For those who don't know, Objenesis a library dedicated to create objects
>> > without calling a constructor. A hidden and forbidden feature of Java that
>> > allowed mocks (EasyMock, Mockito) and proxies (Spring, JBoss) to thrive.

>> > Objenesis has many instantiator and I have a little test to see which are
>> > working on a given JVM. I tried to instantiate a JDK class (ArrayList) and
>> > a class in my project.

>> > There are 3 types of instantiator:

>> > - *Standard:* Just create the class without any constructor
>> > - *Serializable:* Creates an object like Java serialization will do
>> > (calling readObject and so on)
>> > - *Not compliant:* Instantiate a class but not respecting the rules of
>> > the 2 above (for instance, a constructor might be called). Those are used
>> > for test and as a sad fallback

>> > Here are the current results so you can check if everything is as expected:

>> > - *AccessibleInstantiator (NOT_COMPLIANT):* Still working! Just turn
>> > accessible the default constructor. I was surprised it worked
>> > - *MagicInstantiator(STANDARD):* Not working anymore! This one is
>> > generating and instantiator that extends MagicAccessorImpl to be allowed to
>> > call `new Object()` on a class without the class loader complaining
>> > - *ObjectStreamClassInstantiator(SERIALIZATION):* Not working anymore! This
>> > is the one that was used so far. Because it's the fastest one for
>> > serialization. It doesn't work because setAccessible on
>> > ObjectStreamClass.newInstance doesn't work anymore. My personal take is
>> > that this method is so useful for serialization framework that it should
>> > have been public for years
>> > - *SunReflectionFactoryInstantiator (STANDARD):* Still working! This is
>> > the current default for hotspot and openjdk. It uses
>> > sun.reflect.ReflectionFactory*SunReflectionFactorySerializationInstantiator
>> > (SERIALIZATION): *Still working! This is the new default for
>> > serialization on Java 9. It wasn't the default so far for performance
>> > reasons
>> > - *UnsafeFactoryInstantiator (STANDARD):* Still working! Call
>> > Unsafe.allocateInstance. Happily still working. It is not the default for
>> > Hotspot because it is slower than SunReflectionFactoryInstantiator

>> > So the good news are that it is still working without reinventing the wheel.

>> > Henri


More information about the jdk9-dev mailing list