JDK9 and Objenesis

Remi Forax forax at univ-mlv.fr
Fri Jan 13 17:26:59 UTC 2017


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