GSON直接访问私人会员?

2022-09-04 07:33:50

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

注意:B.a被赋值为1,我编码getA()总是返回10

如果我从课堂上访问,一切都按预期工作它不会让我这样做,一切都很好,直到这里B.aA


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

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

输出:

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

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


答案 1

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

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

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

额外阅读

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

答案 2

推荐