Подтвердить что ты не робот

GSON напрямую обращается к частным членам?

Получает ли GSON доступ к закрытым членам класса напрямую, не вызывая его методы получения для получения значения?


Соблюдение правила Java гласит: если у класса 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--");
    }
}

Класс Б:

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

Примечание: Ba присвоено значение 1, и я закодировал getA() чтобы всегда возвращать 10

Если я Ba доступ к Ba из класса 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--");
    }
}

Так как Ba является приватным, предполагается, что он вызывает метод getter, который закодирован так, чтобы всегда возвращать 10 НО вывод, который я получаю:

Выход:

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

поэтому, другими словами, мой метод get для приватного метода никогда не вызывается

4b9b3361

Ответ 1

То, что вы говорите, это инкапсуляция. Это концепция Object Orientated, которая ограничивает доступ определенных членов класса.

Однако у Java есть другой способ доступа к значениям в объекте. То есть, размышление. Это позволяет получить более общий доступ к классу. Например, в случае с Gson они должны знать о каждом поле в классе, но они не могут написать метод для каждого существующего класса. Аналогично, они не могут попросить вас написать для него адаптер JSON. Это побеждает точку рамки.

Входит Отражение. Это позволяет библиотеке Gson иметь единственный метод, который преобразует любой объект в некоторый JSON. Это важно, потому что библиотека Reflections предоставляет API для доступа к частным членам класса, не проходя через аксессоров и мутаторов.

Дополнительное чтение

  • Вам следует взглянуть на Отражение. Это очень мощный API.