GSON直接访问私有成员?

GSON directly accesses private members?

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


遵循的Java规则是如果class B有私有成员无法访问 通过 class A 没有 getter/setter 方法。

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

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

Class答:

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

Class乙:

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() 编码为总是 return 10

如果我从 class A 访问 B.a一切正常 并且 不会让 我来做,到这里都很好


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 是私有的,因此应该调用编码为始终 return 10 的 getter 方法,但我得到的输出是

输出:

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

所以换句话说,我的私有方法的 getter 方法是 NEVER INVOKED

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

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

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

额外阅读