【问题标题】:Java private method hiding public accessors隐藏公共访问器的 Java 私有方法
【发布时间】:2014-06-06 14:29:43
【问题描述】:

我有这样的课:

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 方法(即使它是私有的)并将其视为没有相应设置器的 getter,因此忽略了 compound 的真正公共访问器。

Java Bean 规范中是否有任何内容表明您不能拥有私有 is&lt;Something&gt; 方法,其中 &lt;something&gt; 也是非布尔属性的名称,它也有自己的访问器?当然,在类上使用反射的任何东西都应该简单地忽略私有方法?

【问题讨论】:

  • 尝试将@XmlAccessorType(XmlAccessType.FIELD) 添加到Foo。还要将@XmlTransient 添加到isCompound 以确保安全。哦,还有,it's pretty straightforward to access private members in a class
  • 一般来说,如果 X 是成员字段的名称,最好避免创建名为 getX、setX 或 isX 的自定义方法。通常认为这些名称格式适用于 getter 和 setter(isX 被普遍接受为布尔字段的 getter)。您的环境似乎被命名约定混淆了,您通过将方法名称更改为不与 getter 混淆的名称来解决问题。
  • 是的,我知道您可以使用反射访问私有方法,但 JAX-WS 应该忽略它们,即使它们具有 getter/setter 名称格式。

标签: java reflection properties jax-ws javabeans


【解决方案1】:

如果你改变了会发生什么:

 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.

【讨论】:

  • 方法isCompound的实现与这个问题无关。即使只是return true 也没什么区别。
  • 在类上添加 XmlAccessorType(XmlAccessType.NONE) 以及在 get/set 方法上添加 XmlElement 和 XmlAttribute 怎么样。
  • 我通过将方法名称更改为isACompound 解决了我的问题。我的问题不是如何解决这个问题,而是关于为什么 JAX-WS(或它正在使用的任何东西)没有忽略私有方法,它应该是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 2012-06-02
相关资源
最近更新 更多