Этот пост – не рекомендация. Описанное здесь крайне редко имеет основание к применению (если имеет вообще).Десериализация – полагается, что сериализационная форма уже была когда-то сконструирована, теперь же экземпляр просто восстанавливается с помощью метода
readObject. Вызывается конструктор ближайшего не
serializable родителя.
Внутри десериализация использует
ReflectionFactory.newConstructorForSerialization из пакета
sun.reflect – метод создания объекта заданного типа с указанным (возможно родительским) конструктором. Можно использовать его напрямую. Конструктор всё же вызывается, но это может быть конструктор класса
Object.
Unsafe.allocateInstance – непосредственно создает экземпляр не вызывая конструктор, ничего лишнего.
Оба способа позволяют создать объект, не вызван ни конструктор, ни инициализаторы полей. Все члены остаются со значениями по-умолчанию (
null,
0,
false). Однако для
final поля дефолтным значением считается указанное в инициализации, оно и будет установлено.
Пользуясь этими грязными хаками, помните: пакеты
sun.* никогда не были частью официально поддерживаемого API Java, и есть не во всех версиях Java.
Подробнее читайте на хабре:
1,
2.