Java GSON直接访问私人成员?

Java GSON直接访问私人成员?,java,gson,Java,Gson,GSON是否直接访问类的私有成员而不调用其getter方法来获取值 Java遵循的规则是,如果类B有一个私有成员,那么类a在没有getter/setter方法的情况下无法访问它 现在我在GSON的一个项目中工作,在那里我感觉到getter/setter方法被绕过了[没有使用,私有成员被直接访问] 我只是个学生,所以我可能会错过一些普通的工作 A类: public class A { public static void main(String[] args) { B b

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

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

输出:

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

换句话说,我的私有方法的getter方法永远不会被调用,你所说的是封装。这是一个面向对象的概念,限制某些类成员的访问

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

反省随之而来。它允许Gson库使用一个方法将任何对象转换为一些JSON。这一点很重要,因为反射库提供了一个API来获取类的私有成员,而无需通过访问器和变异器

额外阅读

  • 你应该调查一下。这是一个非常强大的API

GSON可能无论如何都需要通过反射获取字段名,因此我猜它也会通过反射读取值,因为反射可以绕过访问修饰符。阅读更多。@kajacx我看到了你的链接,看起来反射是gson的工作方式,因为在oracle反射文档中,在反射的缺点和内部暴露下,它提到了私有成员访问