隐藏公共访问器的Java私有方法

时间:2014-04-22 09:38:30

标签: java reflection properties jax-ws javabeans

我有一个这样的课程:

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>也是非布尔属性的名称,该属性也有自己的存取?当然,在课堂上使用反射的任何东西都应该忽略私有方法吗?

1 个答案:

答案 0 :(得分: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.