[英]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,用於獲取類的私有成員而無需通過訪問器和更改器。
額外閱讀
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.