Java JDK1.5问题-布尔属性的getter方法被错误调用
Java bean格式:Java JDK1.5问题-布尔属性的getter方法被错误调用,java,hibernate,Java,Hibernate,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() {
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格式的isQualifyFormat方法应该在bean格式的HibernatePersistense过程中调用。据我所知,布尔属性的getter可以是pattern is-或get-。方法is-如果在bean中两者都可用,则具有优先级
但除以下情况外,它在大多数情况下都能正常工作:
如果有任何代码引用同一jar包中的静态方法Format.getQualifyFormat。上面的getQualifyFormat方法被调用,即使它是静态的,并且已经有了is-
当我将代码升级到JDK1.5时,就会发生这种情况。在JDK1.4中它很好。
我猜这可能是由于JDK1.5中的反射改进问题造成的,JDk/jre是否在编译时解析代码并找到静态方法getQualifyFormat的引用,然后将其缓存为属性qualifyFormat的默认getter
有什么想法吗?如果你想让事情正常进行,你必须使用适当的惯例 如果字段名为
xyz
- 访问器(“getter”)称为
(它是 可以也应该被称为getXyz()
iffisXyz()
属于xyz
)布尔值
- 变异子(“setter”)称为
并且必须返回voidsetXyz()
isXyz()
方法旁边有一个静态的getXyz()
方法,至少可以说是自找麻烦。我不知道它是否有效,但它令人非常困惑
在我个人看来,一个具有bean属性的类如果不是getter或setter,就不应该有任何其他名为get*、set*或is*的方法,以使方法意图更清晰。您的代码看起来不一致,而且非常混乱
isQualifyFormat
是方法和字段的名称。此外,该方法本身也返回其他内容。此外,该字段的setter还设置了一些其他变量。令人困惑的是,同意!但是,语法还可以,对吗?字段isQualifyFormat具有setter方法setQualifyFormat和getter方法isQualifyFormat。这也是我的问题,为什么静态方法getQualifyFormat会造成我提到的混乱。我需要关于属性方法如何在我的混乱案例中工作的参考。谢谢!我同意你的建议。但是,问题是,我需要弄清楚在我的情况下它是如何出错的。我的字段isQualifyFormat具有setter方法setQualifyFormat和getter方法isQualifyFormat。当有任何代码引用静态方法格式时,为什么它会点击静态方法getQualifyFormat而不是isQualifyFormat。getQualifyFormat?我的猜测是hibernate首先查找get*()方法,并仅使用is*()方法作为回退。我不确定他们是否检查非静态方法(我甚至不确定bean规范要求方法是非静态的,尽管它们应该是)。所以:保持安全,避免误解。这有关系吗?正如所指出的,您的代码没有遵循JavaBeans规范。编辑这是与OP相关的,而不是与seanizer相关的。