我有這樣一個類:Java的私有方法隱藏公共存取
import java.util.List;
import java.util.String;
import javax.xml.bind.annotation.XmlType;
@XmlType
public class Foo {
private List<Foo> compound;
private String bar;
// private method used internally to know
// if this is a compound instance
private boolean isCompound() {
return compound != null && compound.size() != 0;
}
// public setter for compound instance var
public void setCompound(List<Foo> compound) {
this.compound = compound;
}
// public getter for compound instance var
public List<Foo> getCompound() {
return compound;
}
public void setBar(String bar) {
this.bar = bar;
}
public String getBar() {
return bar;
}
}
在正常使用時,這個類的行爲如你所願。方法getCompound
和setCompound
獲取並設置化合物列表。但是,我將此類用作在使用JAX-WS構建的Web服務中傳遞的對象。當JAX-WS編譯器看到這個類時,它將忽略setCompound
和getCompound
訪問器,並且在XSD中出現的唯一屬性是bar
。
在一天中大部分時間撞擊牆壁後,我決定嘗試將私有方法isCompound
的名稱更改爲isACompound
,突然間一切都如您所願。 JAX-WS爲compound
屬性創建了正確的模式。
什麼似乎是發生的是,JAX-WS是看到了isCompound
方法(即使它是私有的),並把它當作沒有相應的setter一個getter,因此忽略了真正的公共訪問器compound
。
Java Bean規範中是否有任何內容說明您不能擁有私有的is<Something>
方法,其中<something>
也是非布爾屬性的名稱,它也有自己的訪問器?當然,任何使用對課堂反思的東西都應該忽略私人方法?
嘗試增加'@XmlAccessorType(XmlAccessType.FIELD)''來Foo'。還要將'@ XmlTransient'添加到'isCompound'以保證安全。哦,還有,[訪問類中的私有成員非常簡單](http://stackoverflow.com/questions/11483647/how-to-access-private-methods-and-private-data-members-via-reflection )。 – kolossus
一般來說,如果X是成員字段的名稱,避免創建名爲getX,setX或isX的自定義方法是一個好主意。通常認爲這些名稱格式是用於getter和setter(isX被普遍接受爲布爾字段的getter)。看起來你的環境被命名約定弄糊塗了,並且你通過改變方法名稱來解決這個問題,使其與getter沒有混淆。 – Don
是的,我知道你可以使用反射訪問私有方法,但JAX-WS應該忽略它們,即使它們具有getter/setter名稱格式。 – mluisbrown