【问题标题】:JDK 1.5 issue - The getter method of boolean property gets invoked incorrectlyJDK 1.5 问题 - 布尔属性的 getter 方法被错误调用
【发布时间】:2010-10-11 22:12:35
【问题描述】:

Java bean 格式

public class Format extends HibernateBean implements Serializable {

  private static final Logger log = Logger.getLogger(Format.class);
  private Long id;
  private boolean isQualifyFormat;

  ...other fields

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  **//static method, it's exposed to a HttpServlet**
  public static Format getQualifyFormat() throws HibernateException {        
    log.debug("getQualifyFormat");
    ...
  }

  /**
   * @hibernate.property column="df_isqualifyinglistformat" type="boolean"
   * @return boolean
   */
  public boolean isQualifyFormat() {
     log.debug ("isQualifyFormat");
     return isQualifyingListFormat;
  }

  public void setQualifyFormat(boolean qualifyFormat) {
      isQualifyingListFormat = qualifyingListFormat;
  }  
  ...

 }

Hibernate 映射文件,Format.hbm.xml

 <hibernate-mapping>
 <class
    name="Format"
    table="dbo.mc_distribution_format"
    schema="data"    
  >

  <id
      name="id"
      column="df_formatid"
      type="java.lang.Long"
   >
      <generator class="native"></generator>
   </id>      
   <property
       name="qualifyFormat"
       type="boolean"
       update="true"
       insert="true"
       column="df_isqualifyformat"
    />

理论上,bean Format的方法isQualifyFormat应该在Hibernatepersistense过程中调用bean Format。据我所知,布尔属性的getter可以是模式is-get-。如果方法 is- 在 bean 中两者都可用,则具有优先权。

但是,它在大多数情况下都能正常工作,但以下情况除外: 如果有代码参考同一个jar包中的静态方法Format.getQualifyFormat。上面的 getQualifyFormat 方法以某种方式被调用,即使它是静态的并且已经有 is-

当我将代码升级到 JDK 1.5 时会发生这种情况。它在 JDK 1.4 中很好。 我猜这可能是由于 JDK 1.5 中的反射改进问题引起的,jdk/jre 是否会在编译时解析代码并找到静态方法 getQualifyFormat 的引用,然后将其缓存为属性qualifyFormat的默认getter?

有什么想法吗?

【问题讨论】:

  • 您的代码看起来不一致并且非常混乱。 isQualifyFormat 是方法和字段的名称。此外,该方法正在返回其他内容。此外,该字段的 setter 还设置了一些其他变量。
  • 令人困惑,是的,同意!但是,语法没问题,对吧?字段 isQualifyFormat 具有 setter 方法 setQualifyFormat 和 getter 方法 isQualifyFormat。这也是我的问题,为什么静态方法 getQualifyFormat 会导致我提到的混乱。我需要有关属性方法在我的混乱案例中如何工作的参考。

标签: java hibernate


【解决方案1】:

如果你想让事情正常工作,你必须使用适当的约定。

如果你的字段名是xyz

  • 访问器(“getter”)被称为getXyz()(它 可以也应该被称为 isXyz() iff xyz 属于类型 boolean)
  • mutator(“setter”)被调用 setXyz() 并且必须返回 void

如果您不遵守这些约定,Java bean 方法将无法工作,并且几乎所有框架都使用这些方法。

此外,至少可以说,在 isXyz() 方法旁边有一个静态 getXyz() 方法是自找麻烦。我不知道它是否有效,但它非常令人困惑。

在我个人看来,具有 bean 属性的类不应该有任何其他名为 get*、set* 或 is* 的方法,如果它们不是 getter 或 setter,以使方法意图更清晰。

【讨论】:

  • 谢谢!我同意你的建议。但是,关键是,我需要弄清楚在我的情况下它是如何出错的。我的字段 isQualifyFormat 具有 setter 方法 setQualifyFormat 和 getter 方法 isQualifyFormat。当有任何代码引用静态方法Format.getQualifyFormat时,为什么它会命中静态方法getQualifyFormat而不是isQualifyFormat?
  • 我的猜测是hibernate首先寻找 get*() 方法并使用 is*() 方法作为后备。而且我不确定他们检查非静态方法(我什至不确定bean规范要求方法是非静态的,尽管它们应该是)。所以:注意安全,避免误会。
  • 这有关系吗?正如所指出的,您的代码不遵循 Java Beans 规范。 edit 这是关于 OP 而不是 seanizer。
猜你喜欢
  • 2012-09-16
  • 2014-03-02
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 2018-07-14
相关资源
最近更新 更多