2015-06-23 4 views
5

उदा।जावा में मेटा फ़ील्ड या विधियों को संदर्भित करना क्यों संभव नहीं है?

class Foo { 
    Integer bar; 
} 

साथ मुझे आश्चर्य है कि क्यों वहाँ एक भाषा सुविधा है कि मेरे पास

Foo.class.bar //yes, xxx.class returns something of java.lang.Class<T> 

मेटा क्षेत्र पट्टी का उल्लेख करने के लिए सक्षम बनाता है ऐसा नहीं है?

मैं प्रो जेपीए 2 पुस्तक पढ़ रहा हूं और ऐसा लगता है कि कैनोलिक मेटामोडेल पीढ़ी आवश्यक है, क्योंकि जावा में यह संभव नहीं है।

नोट, यह सैद्धांतिक प्रश्न जिज्ञासा से बाहर है, जहां मैं कुछ अंतर्दृष्टि प्राप्त करना चाहता हूं, यह सुविधा क्यों लागू नहीं की गई थी।

--- अपडेट ---

मेरे सवाल में थोड़ा और अधिक विस्तार से बता दें इकाई ग्राफ़ एपीआई द्वारा जेपीए में विशेषताएं जोड़ना के उदाहरण पर विचार:

EntityGraph<Foo> g = myEntityManager.createEntityGraph(Foo.class) 
g.addAttributeNodes("bar") 

कोई औपचारिक है स्ट्रिंग "बार" और फू की विशेषता bar के बीच लिंक (कंपाइलर/आईडीई के लिए)।

+0

आप 'फील्ड फ़ील्ड = Foo.classgetDeclaredField ("बार") का उपयोग कर सकते हैं; ' –

+0

मुझे पता है, लेकिन फिर मैं एक स्ट्रिंग अक्षर का उपयोग करता हूं, जो कि प्रकार नहीं है और न ही सुरक्षित –

+0

जावा 8 के बाद, एक विधि प्रतिनिधित्व मौजूद है : 'System.out :: println' हालांकि इसमें' फ़ील्ड' जैसी कोई प्रतिबिंब क्षमता नहीं है। –

उत्तर

0

सैद्धांतिक रूप से मैं कक्षा संपत्ति/क्षेत्र को 'मेटा' फ़ील्ड नहीं कहूंगा। मेटा-डेटा जावा एनोटेशन के माध्यम से गुण/फ़ील्ड को सौंपा गया है और यह मेटा-डेटा प्रतिबिंब के माध्यम से उपयोग किया जाता है। Foo.class.bar करके आप इस सुंदर स्थिर भाषा के ऑब्जेक्ट-ओरिएंटेशन के पूरे बिंदु को नष्ट कर देते हैं। (या दूसरे शब्दों में जावा इसे करने के लिए पर्याप्त नहीं है))

+0

मेटा-डेटा एनोटेशन विशिष्ट नहीं है। Foo.class.bar लिखकर संकलक टाइप सिस्टम को और भी आगे बढ़ा सकता है और सत्यापित कर सकता है कि वर्तमान फू के विपरीत यह बार मौजूद है।classgetDeclaredField ("बार"), जहां "बार" सिर्फ एक स्ट्रिंग अक्षर है। –

0

मैं कहूंगा कि ऐसी सुविधा की अनुपस्थिति का मुख्य कारण यह है कि यह उपयोगी नहीं होगा।

हम कभी भी एक विशिष्ट वर्ग में किसी विशिष्ट क्षेत्र की मेटा-सूचना के लिए क्यों पूछेंगे?

यदि हम कक्षा और फ़ील्ड जोड़ी को हार्डकोड करते हैं, तो हम पहले से ही सभी फ़ील्ड की मेटा-सूचना को जानते हैं, क्योंकि उन्हें रनटाइम पर बदला नहीं जा सकता है। Foo.class.bar.getType() के माध्यम से प्राप्त जानकारी का उद्देश्य क्या होगा जब हम पहले से ही जानते हैं कि परिणाम Integer.class है?

+0

यह किसी क्षेत्र की मेटा-सूचना पूछने के बारे में नहीं है - यह कक्षा के उस क्षेत्र का जिक्र करने के बारे में है, उदाहरण के स्तर पर नहीं। –

1

क्योंकि .class एक जादू क्षेत्र है कि संकलन समय पर अपने वर्तमान वर्ग रिटर्न नहीं है, यह सिर्फ एक sugargetClass() विधि, कि Class वस्तु का उदाहरण पर केवल क्रम में निष्पादित किया जाएगा बदलने के लिए है। आपके 'फीचर' को लागू करने के लिए पूरी अवधारणा के पुनर्निर्माण की आवश्यकता है।

आपके प्रश्न का उत्तर देने वाला सबसे विश्वसनीय सिद्धांत इस विचार पर आधारित होगा कि उस समय आपकी 'फीचर' वास्तव में 'उपयोगी' दिखाई नहीं दे रही थी, जब प्रतिबिंब मॉडल जावा में डिज़ाइन किया गया था।

संबंधित मुद्दे