2014-04-22 64 views
2

我有這樣一個類: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; 
    } 
} 

在正常使用時,這個類的行爲如你所願。方法getCompoundsetCompound獲取並設置化合物列表。但是,我將此類用作在使用JAX-WS構建的Web服務中傳遞的對象。當JAX-WS編譯器看到這個類時,它將忽略setCompoundgetCompound訪問器,並且在XSD中出現的唯一屬性是bar

在一天中大部分時間撞擊牆壁後,我決定嘗試將私有方法isCompound的名稱更改爲isACompound,突然間一切都如您所願。 JAX-WS爲compound屬性創建了正確的模式。

什麼似乎是發生的是,JAX-WS是看到了isCompound方法(即使它是私有的),並把它當作沒有相應的setter一個getter,因此忽略了真正的公共訪問器compound

Java Bean規範中是否有任何內容說明您不能擁有私有的is<Something>方法,其中<something>也是非布爾屬性的名稱,它也有自己的訪問器?當然,任何使用對課堂反思的東西都應該忽略私人方法?

+0

嘗試增加'@XmlAccessorType(XmlAccessType.FIELD)''來Foo'。還要將'@ XmlTransient'添加到'isCompound'以保證安全。哦,還有,[訪問類中的私有成員非常簡單](http://stackoverflow.com/questions/11483647/how-to-access-private-methods-and-private-data-members-via-reflection )。 – kolossus

+0

一般來說,如果X是成員字段的名稱,避免創建名爲getX,setX或isX的自定義方法是一個好主意。通常認爲這些名稱格式是用於getter和setter(isX被普遍接受爲布爾字段的getter)。看起來你的環境被命名約定弄糊塗了,並且你通過改變方法名稱來解決這個問題,使其與getter沒有混淆。 – Don

+0

是的,我知道你可以使用反射訪問私有方法,但JAX-WS應該忽略它們,即使它們具有getter/setter名稱格式。 – mluisbrown

回答

0

如果更改,會發生什麼:

return compound != null && compound.size() != 0; 
//To: 
private boolean isCompound() { 
boolean check = false; 
if(compound !=null && compound.size()!=0){ 
    check = true; 
}else{ 
    check =false; 
} 
    return check; 
} 

//or 
@XmlAccessorType(XmlAccessType.NONE) on the class and @XmlElement and @XmlAttribute on the get/set methods. 
+0

就這個問題而言,「isCompound」方法的實現是無關緊要的。即使它只是「迴歸真實」,也沒有什麼區別。 – mluisbrown

+0

如何在類中添加XmlAccessorType(XmlAccessType.NONE),並在get/set方法中添加XmlElement和XmlAttribute。 – Petro

+0

我通過將方法名稱更改爲'isACompound'解決了我的問題。我的問題不是如何解決這個問題,而是爲什麼JAX-WS(或者它使用的是什麼)不忽略私有方法,它應該是。 – mluisbrown