gpt4 book ai didi

java - GSON直接访问私有(private)成员?

转载 作者:搜寻专家 更新时间:2023-10-30 21:19:50 25 4
gpt4 key购买 nike

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


遵循的 Java 规则是,如果 class B 有私有(private)成员,不能访问 class A 没有 getter/setter方法。

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

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

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

如果我从 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 是私有(private)的,所以应该调用被编码为始终返回 10 的 getter 方法,但我得到的输出是

输出:

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

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

最佳答案

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

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

进来反射(reflection)。它允许 Gson 库具有将任何对象转换为某种 JSON 的单一方法。这一点很重要,因为 Reflections 库提供了一个 API,无需通过访问器和修改器即可获取类的私有(private)成员。

额外阅读

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

关于java - GSON直接访问私有(private)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28927406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com