摘要:
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--");
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
注意: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--");
}
}
Run Code Online (Sandbox Code Playgroud)
现在因为Ba是私有的,所以应该调用被编码为总是返回10的getter方法但是得到的输出是
输出:
{
"a": 1
}
--end--
Run Code Online (Sandbox Code Playgroud)
所以换句话说,私有方法的getter方法永远不会被调用
chr*_*her 21
你所说的是封装.这是一个面向对象的概念,限制了某些类成员的访问.
但是,Java有另一种访问对象中值的方法.那就是反思.这允许对类进行更通用的访问.例如,在Gson的情况下,他们需要知道类中的每个字段,但是他们不能为现有的每个类编写方法.同样,他们也不能要求你为它编写JSON适配器.这违背了框架的要点.
反思来了.它允许Gson库有一个方法将任何对象转换为一些JSON.这很重要,因为Reflections库提供了一个API,用于获取类的私有成员而无需通过访问器和更改器.
额外阅读
| 归档时间: |
|
| 查看次数: |
8994 次 |
| 最近记录: |