GSON直接访问私人会员?

时间:2015-03-08 14:14:03

标签: java gson

GSON是否直接访问类的私有成员而不调用其getter方法来获取值?


遵循的Java规则是,如果 B类有私人成员, A类 无法访问 没有getter / setter方法

现在我正在与GSON合作开发一个项目,我觉得getter / setter方法被绕过[未使用,私有成员被直接访问]

我只是一名学生,所以我可能会错过一些常见的工作。

A类:

public class A {
    public static void main(String[] args) {
        B b = new B();
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(b));
        System.out.println("--end--");
    }
}

B组:

public class B {
    private int a;

    public B() {
        a = 1;
    }

    public int getA() {
        System.out.println("I am invoked!");
        return 10;
    }

    public void setA(int a) {
        this.a = a;
    }
}

注意:B.a的值为1,我将getA()编码为始终返回10

如果我从班级B.a访问A一切按预期工作并且不会让我这样做,那么一切都很好,直到这里< / p>


GSON怀疑从这里开始

public class A {
    public static void main(String[] args) {
        B b = new B();
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(b));
        System.out.println("--end--");
    }
}

由于B.a是私有的,因此应该调用被编码为总是返回10的getter方法但是我得到的输出是

输出:

{
  "a": 1
}
--end--

所以换句话说,私有方法的getter方法是从未调用

1 个答案:

答案 0 :(得分:20)

你所说的是封装。这是一个面向对象的概念,限制了某些类成员的访问。

但是,Java还有另一种访问对象中值的方法。那就是反思。这允许对类进行更通用的访问。例如,在Gson的情况下,他们需要知道类中的每个字段,但是他们不能为现有的每个类编写方法。同样,他们也不能要求你为它编写JSON适配器。这违背了框架的要点。

来到反思。它允许Gson库有一个方法将任何对象转换为某些JSON。这很重要,因为Reflections库提供了一个API,用于获取类的私有成员而无需通过访问器和更改器。

额外阅读

  • 你应该看一下Reflection。这是一个非常强大的API。