0

我有这个java类

class Go {

  public boolean isSha1() {
    return true;
  }
  public String getSha1() {
    return this.sha1;
  }
  public String setSha1(String sha1) {
  }
  ...
}

当我尝试使用 java 的 java.beans.XMLEncoder 对其进行编码时,它会输出sha1 之外的所有属性。这就像它跳过一个属性!

4

2 回答 2

3

您没有遵循 JavaBeans 规范,因此不要期望它能够处理您的任意命名。

JavaBeans 说,如果它找到一对访问器,void setX(Y)并且Y getX()X则被标识为类型为 的读写属性Y。它是特定于类型的,Y在两种情况下都是相同的。(符号是我的,我只是想以具体的方式说明。)如果getX()缺少该方法,X则为只写属性。如果setX(Y)缺少,X则为只读属性。

类型所在的属性boolean有特殊处理。如果有方法boolean isX(),它将用于对属性的读取访问。有方法也没关系boolean getX(),但不会用。

在您的代码中,setSha1()默认情况下会忽略自省,因为它被调用set但不接受任何参数。

但是,您已经给出了isSha1()getSha1()不同的返回类型,因此内省者无法判断 sha1 属性的类型应该是什么。此处的行为未由规范定义。您可能可以通过提供显式 bean 描述符来解决此问题,但没有人这样做。

所以,结果是,不要这样做。遵循规范中给出的约定。

于 2013-08-09T22:31:30.373 回答
0

这是否是 JDK 中的错误(未知),但目前的修复/解决方法是将 isSha1 重命名为其他内容(任何内容)。奇怪的。

于 2013-08-09T20:49:58.770 回答