【问题标题】:Final boolean field not initialized when object is created via Reflection通过反射创建对象时未初始化最终布尔字段
【发布时间】:2017-01-13 16:08:35
【问题描述】:

今天发现了一件奇怪的事情。 我有一个受保护的最终布尔字段:

 protected final boolean active = true;

如您所见,我希望在实例化对象后使用 TRUE 值初始化该字段。这是一个数据库模型类。我使用 mybatis 3.1.1 从数据库中读取数据。 我看到的是,当我使用 mybatis SqlSession.selectOne() 调用 db 时,我收到一个 active == false 的对象!但我不会在 sql 查询中更改此字段。 我挖掘了 mybatis 代码,发现在DefaultObjectFactory.java#create(Class<T>, List<Class<?>>, List<Object>) 我的对象被实例化并且这个最终的“活动”字段等于 FALSE。 好吧,我很困惑,找不到任何有关它的信息。 有人可以解释一下这里发生了什么吗?因为我认为在构造函数逻辑结束后必须初始化最终字段。

【问题讨论】:

  • 普通反射无法绕过构造函数,所以在这种情况下这是不可能的。反序列化可以,但这意味着在存储对象时该字段已经是false。一般来说,final 这种类型的实例字段几乎没有意义。没有普通代码会注意到该字段中实际存储的内容,因为这是一个编译时常量。
  • 我查看了DefaultObjectFactory,它直接使用java.lang.reflect.Constructor,所以它不能绕过初始化。问题是,你是怎么得出activefalse 的结论。
  • @Holger,我查看了调试器。然后通过 SOAP 将实例化的对象发送到客户端,客户端也将其视为错误。
  • 确保编译后的类与源代码匹配。那么,什么“通过 SOAP 发送”?它是读取字段还是调用 getter?
  • @Holger,谢谢。会检查。也许 intellij idea tomcat runner 搞砸了课程。

标签: java reflection constructor initialization final


【解决方案1】:

感谢@Holger!

我搞砸了课程。最终字段初始化按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2018-02-15
    • 1970-01-01
    相关资源
    最近更新 更多