Is default no-args constructor mandatory for Gson?
As of Gson 2.3.1.
Regardless of what the Gson documentation says, if your class doesn't have an no-args constructor and you have not registered any InstanceCreater
objects, then it will create an ObjectConstructor
(which constructs your Object) with an UnsafeAllocator
which uses Reflection to get the allocateInstance
method of the class sun.misc.Unsafe
to create your class' instance.
This Unsafe
class goes around the lack of no-args constructor and has many other dangerous uses. allocateInstance
states
Allocate an instance but do not run any constructor. Initializes the class if it has not yet been.
So it doesn't actually need a constructor and will go around your two argument constructor. See some examples here.
If you do have a no-args constructor, Gson will use an ObjectConstructor
which uses that default Constructor
by calling
yourClassType.getDeclaredConstructor(); // ie. empty, no-args
My 2 cents: Follow what Gson says and create your classes with a no-arg constructor or register an InstanceCreator
. You might find yourself in a bad position using Unsafe
.