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