GSON直接访问私人会员?

概要:

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


接下来的Java规则是,如果B类具有私有成员, 没有getter / setter方法, A类 就无法访问它。

现在我正在与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; } } 

注意:Ba的值为1,我将getA()编码为总是返回10

如果我从A级访问Ba, 一切都按预期工作 ,它不会让我这样做,一切都很好,直到这里


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--"); } } 

现在因为Ba是私有的,所以应该调用被编码为总是返回10的getter方法但是得到的输出是

输出:

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

换句话说,私有方法的getter方法永远不会被调用

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

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

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

额外阅读

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