2015-03-08 7 views
7

सारांश:जीएसओएन सीधे निजी सदस्यों तक पहुंचता है?

करता GSON पहुँच निजी सदस्यों एक वर्ग के सीधे मूल्य लाने के लिए अपने गेटर तरीकों लागू बिना?


जावा के नियम यह है कि पीछा किया जाता है है अगर वर्ग बीवर्ग एक गेटर बिना/सेटर तरीके से एक निजी सदस्य यह पहुँचा नहीं जा सकता है।

अब मैं 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; 
} 
} 

नोट: बा 1 का मान असाइन किया गया है, और मैं Geta() कोडित हमेशा 10 वापस जाने के लिए

अगर मैं वर्ग एक से बा का उपयोग, सब कुछ के रूप में उम्मीद काम करता है और यह अभ्यस्त मुझे यह करना, सब ठीक करते हैं यहां तक ​​


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

अब चूंकि बी निजी है, इसे गेटटर विधि का आह्वान करना है जिसे हमेशा 10 लौटने के लिए कोड किया जाता है लेकिन मुझे प्राप्त होने वाला आउटपुट

आउटपुट:

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

तो दूसरे शब्दों में निजी विधि के लिए मेरे गेटर विधि

+1

जीएसओएन को शायद फ़ील्ड नामों को प्रतिबिंब द्वारा प्राप्त करने की आवश्यकता है, इसलिए मुझे लगता है कि यह प्रतिबिंब द्वारा मूल्यों को भी पढ़ता है, क्योंकि प्रतिबिंब एक्सेस संशोधक को बाईपास कर सकता है। और पढ़ें [यहां] (http://docs.oracle.com/javase/tutorial/reflect/)। – kajacx

+0

@kajacx मैंने आपका लिंक देखा, दिखता है कि प्रतिबिंब इस तरह के प्रतिबिंब के ओरेकल दस्तावेज़ में कोज़ काम करता है, ** प्रतिबिंब ** के चित्र, और ** आंतरिक का एक्सपोजर ** ** ** निजी सदस्य पहुंच के बारे में उल्लेख किया गया है * * –

उत्तर

12

कैप्सूलीकरण क्या बात कर रहे हैं लागू नहीं है। यह एक ऑब्जेक्ट ओरिएंटेड अवधारणा है जो कुछ वर्ग सदस्यों की पहुंच को प्रतिबंधित करती है।

हालांकि, जावा के पास किसी ऑब्जेक्ट में मानों का उपयोग करने का एक और तरीका है। वह है, प्रतिबिंब। यह कक्षा में अधिक सामान्य पहुंच के लिए अनुमति देता है। उदाहरण के लिए, जीसन के मामले में, उन्हें कक्षा में प्रत्येक क्षेत्र के बारे में जानने की आवश्यकता है, लेकिन वे अस्तित्व में प्रत्येक वर्ग के लिए एक विधि नहीं लिख सकते हैं। इसी तरह, वे इसके लिए एक JSON एडाप्टर लिखने के लिए नहीं कह सकते हैं। वह ढांचे के बिंदु को हरा देता है।

प्रतिबिंब में आता है।यह जीएसएस लाइब्रेरी को एक ही विधि रखने की अनुमति देता है जो कुछ JSON में किसी भी ऑब्जेक्ट को परिवर्तित करता है। यह महत्वपूर्ण है क्योंकि रिफ्लेक्शन लाइब्रेरी एक्सेसर्स और म्यूटेटर के बिना किसी कक्षा के निजी सदस्यों को प्राप्त करने के लिए एक एपीआई प्रदान करती है।

अतिरिक्त पठन

  • आप Reflection में एक नज़र होनी चाहिए। यह एक बहुत ही शक्तिशाली एपीआई है।
संबंधित मुद्दे