2012-06-25 42 views
2

看一看下面的情形:为什么Google的JSON转换器“GSON”不遵循骑乘概念的方法?

public class ParentClass { 

    private Integer testVar = 1; 

    public Integer getTestVar() { 
     return testVar; 
    } 

    public void setTestVar(Integer testVar) { 
     this.testVar = testVar; 
    } 
} 


public class ChildClass extends ParentClass { 

    private Integer testVar = 2; 

    @Override 
    public Integer getTestVar() { 
     return testVar; 
    } 

    @Override 
    public void setTestVar(Integer testVar) { 
     this.testVar = testVar; 
    } 
} 


public class TestClass { 

    public static void main(String[] args) { 

     ChildClass childClass = new ChildClass(); 
     childClass.setTestVar(3); 
     Gson gson = new Gson(); 
     String str = gson.toJson(childClass); 
     System.out.println(str); 
    } 
} 

在这里,我已经使用com.google.gson.Gson包JSON的转换。它提供了以下的输出:

{ “的testvar”:1}

我的JSON字符串预期的3,但我得到的是由父类中的testvar变量中的值。

  1. 不应该孩子的getTestVar覆盖父对象?

  2. 是被直接访问的实例成员(改变每个类的实例成员的名字,但保留getter的名字相同就证明了这一点)?

  3. 如果是,怎么能有人直接访问私人成员?

编辑:我已经编辑了这个问题。此版本仅在json中显示父级的值。有没有办法让孩子的实例成员?

回答

3
  1. 是的,它

  2. 是,GSON直接访问领域。其他执行类似任务的库通常允许您在字段和属性(即使用getter和setter)之间进行选择,但Gson只支持字段访问。

  3. 私有字段的目的是为常规代码无法访问,但在某些特殊情况下(如序列化/反序列化),直接访问它们是完全合理的。这就是为什么您可以使用反射访问私人领域(请参阅AccessibleObject)。