2017-01-13 10 views
0

нашел странные вещи сегодня. У меня есть защищенное окончательное логическое поле:Конечное булевское поле не инициализируется, когда объект создается через Reflection

protected final boolean active = true; 

Как вы можете видеть, я надеюсь, это поле будет инициализирован истинное значение после экземпляра объекта. Это класс модели базы данных. Я использую mybatis 3.1.1 для чтения данных из базы данных. Что я вижу, когда я звоню в db, используя mybatis SqlSession.selectOne() Я получаю объект с активным == false! Но я не изменяю это поле в sql-запросе. Я прорыл код mybatis и обнаружил, что в DefaultObjectFactory.java#create(Class<T>, List<Class<?>>, List<Object>) мой объект создан и имеет это последнее «активное» поле, равное FALSE. хорошо, я полностью смущен и не могу найти никакой информации о нем. Не могли бы вы объяснить, что здесь происходит? поскольку я думал, что окончательное поле должно быть инициализировано после завершения логики конструктора.

+0

Ordinary Reflection не может обойти конструктор, поэтому в этом случае это невозможно. Десериализация может, но это будет означать, что поле было уже «ложным», когда объект был сохранен. Как правило, в поле «final» экземпляра такого типа мало смысла. Никакой обычный код никогда не заметит, что на самом деле хранится в поле, так как это константа времени компиляции. – Holger

+0

Я изучил это 'DefaultObjectFactory' и прямолинейно использует' java.lang.reflect.Constructor', поэтому он не может обойти инициализацию. Вопрос в том, как вы пришли к выводу, что 'active' является' ложным'. – Holger

+0

@Holger, я посмотрел в отладчик. Этот экземпляр объекта затем отправляется через SOAP клиенту, и клиент видит его также как ложный. –

ответ

0

Благодаря @Holger!

Я испортил классы. Окончательная инициализация поля работает, как ожидалось.

 Смежные вопросы

  • Нет связанных вопросов^_^