簡體   English   中英

GSON直接訪問私人會員?

[英]GSON directly accesses private members?

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

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

由於Ba是私有的,因此應該調用被編碼為總是返回10的getter方法但是我得到的輸出是

輸出:

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

所以換句話說,私有方法的getter方法永遠不會被調用

你所說的是封裝。 這是一個面向對象的概念,限制了某些類成員的訪問。

但是,Java有另一種訪問對象中值的方法。 那就是反思。 這允許對類進行更通用的訪問。 例如,在Gson的情況下,他們需要知道類中的每個字段,但是他們不能為現有的每個類編寫方法。 同樣,他們也不能要求你為它編寫JSON適配器。 這違背了框架的要點。

反思來了。 它允許Gson庫有一個方法將任何對象轉換為一些JSON。 這很重要,因為Reflections庫提供了一個API,用於獲取類的私有成員而無需通過訪問器和更改器。

額外閱讀

  • 你應該看一下Reflection 它是一個非常強大的API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM