2009-10-28 26 views
5

मान लीजिए, मेरे पास बहुत सी कक्षाएं हैं, जिन्हें जावा प्रतिबिंब (किसी कारण से) का उपयोग करके बनाया गया है। अब मुझे फ़ील्ड में मूल्यों को पोस्ट इंजेक्ट करने की आवश्यकता है, जो @PostInject के साथ एनोटेटेड हैं।जावा: प्रतिबिंब का उपयोग करके खेतों को इंजेक्ट करने का सबसे तेज़ तरीका क्या है?

public class SomeClass { 
    @PostInject 
    private final String someString = null; 

    public void someMethod() { 
    // here, someString has a value. 
    } 
} 

मेरा प्रश्न है: क्या एक तेजी से प्रतिबिंब का उपयोग कर एक क्षेत्र स्थापित करने के लिए तरीका है?
याद रखें, मुझे इसे कई कक्षाओं में अक्सर करने की ज़रूरत है, यह क्यों प्रदर्शन प्रासंगिक है।

क्या मैं अंतर्ज्ञान द्वारा करना होगा इस छद्म कोड से दिखाया गया है:

  • वर्ग
    clazz.getFields();
  • जांच के सभी क्षेत्रों, जो @PostInject
    साथ eachField.getAnnotation(PostInject.class);
  • एनोटेट मिल इन क्षेत्रों को सुलभ बनाएं
    eachAnnotatedField.setAccessible(true);
  • उन्हें सेट करें एक निश्चित मूल्य
    eachAnnotatedField.set(clazz, someValue);

मुझे डर है कि सभी क्षेत्रों में हो रही करने के लिए सबसे धीमी बात है हूँ।
क्या मुझे कोई क्षेत्र मिल सकता है, जब मैं इसे शुरुआत से जानता हूं?

नोट: मैं कक्षाओं को कुछ इंटरफ़ेस लागू करने की अनुमति नहीं दे सकता, जो किसी विधि का उपयोग करके फ़ील्ड सेट करने की अनुमति देता है। मुझे POJO की आवश्यकता है।

नोट 2: मैं पोस्ट-फील्ड इंजेक्शन क्यों चाहता हूं: एपीआई उपयोगकर्ता के दृष्टिकोण से, अंतिम फ़ील्ड का उपयोग करना संभव होना चाहिए। इसके अलावा, जब एपीआई द्वारा फ़ील्ड के प्रकार और संख्या को प्राथमिकता नहीं दी जाती है, तो इंटरफ़ेस का उपयोग करके फ़ील्ड प्रारंभिकता प्राप्त करना असंभव है।

NOTE2b: उपयोगकर्ता की दृष्टि से, अंतिम अनुबंध नहीं टूटी हुई है। यह अंतिम रहता है। सबसे पहले, एक फ़ील्ड शुरू हो जाता है, तो इसे बदला नहीं जा सकता है। वैसे: ऐसे कई एपीआई हैं जो इस अवधारणा का उपयोग करते हैं, उनमें से एक जेएक्सबी (जेडीके का हिस्सा) है।

+0

मैं सिर्फ इतना उत्सुक हूं कि आपको ऐसा करने की आवश्यकता क्यों होगी? क्या इस के पीछे एक दिलचस्प कहानी है, और यदि वहां है, तो क्या आप इसे साझा कर सकते हैं? –

+0

मैं एक मार्शेलर लिख रहा हूं | जेएक्सबी के समान unmarshaller, लेकिन अधिक विशेष (इस प्रकार अधिक सीमित)। एनोटेशन के साथ पीओजेओ बस बहुत लचीला है। –

+1

यदि आपको अपनी एनोटेशन का उपयोग करने के लिए कार्यान्वयन करने की आवश्यकता है - आप वास्तव में यहां एक इंटरफ़ेस का उपयोग करने के लिए कुछ भी प्राप्त नहीं कर रहे हैं - और आप वास्तव में POJO का उपयोग नहीं कर रहे हैं - http://en.wikipedia.org/wiki/Plain_Old_Java_Object#Contextual_variations – Nate

उत्तर

7

ऑब्जेक्ट का निर्माण करने के बाद चरण 1 से 3 करने के बारे में और एनोटेटेड फ़ील्ड्स के सेट को सहेजने के बाद आप ऑब्जेक्ट में ही प्राप्त करते हैं या कक्षा के अलग-अलग मानचित्र को सेट-ऑफ-एनोटेटेड-फ़ील्ड में रखते हुए?

फिर, मैं आरएसपी के विचार पसंद है जब आप, 4.

+0

बिल्कुल सही विचार !!! –

1

+1 एक वस्तु में इंजेक्शन फ़ील्ड अपडेट objects या अलग नक्शे से सेट निकालते हैं और प्रदर्शन कदम की जरूरत है।


एक और विकल्प, जैसा कि आप कहते हैं कि आप शुरुआत से संबंधित कुछ क्षेत्रों को जानते हैं, केवल उन क्षेत्रों या विधियों के लिए पूछना है।

उदाहरण: java/lang/Class.html

1

में getDeclaredMethod या getDeclaredField देखें कि क्या वह किसी भी अच्छा है पता नहीं है, लेकिन this project लगता है कि यह आप क्या चाहते हैं करना होगा। उद्धरण:

प्रतिबिंब उपयोगिताओं का एक सेट और विविध से संबंधित उपयोगिताओं वर्गों और अपने खेतों कोई निर्भरता जो जावा 1.5 और जेनरिक के साथ संगत है के साथ साथ काम करना।

उपयोगिताओं कैश प्रतिबिंब डेटा उच्च प्रदर्शन ऑपरेशन के लिए लेकिन कमजोर/नरम कैशिंग का उपयोग करता खुला ClassLoaders पकड़े और स्थायी रूप से स्मृति में मौजूद कैश के कारण से बचने के लिए। को ओवरराइड करने की क्षमता आपके साथ कैशिंग तंत्र समर्थित है।

0

आप मौजूदा ढांचे का फायदा उठा सकते हैं जो वस्तु निर्माण पर निर्भरता को इंजेक्ट करने की अनुमति देते हैं। उदाहरण के लिए Spring allows to do that पहलू बुनाई के साथ। सामान्य विचार यह है कि आप वसंत स्तर पर बीन निर्भरताओं को परिभाषित करते हैं और अपने ऑब्जेक्ट सृजन की सलाह देने के लिए केवल लक्ष्य वर्गों को चिह्नित करते हैं। वास्तविक निर्भरता रिज़ॉल्यूशन तर्क सीधे कक्षा बाइट-कोड में इंजेक्शन दिया जाता है (यह संकलन या लोड-टाइम बुनाई का उपयोग करना संभव है)।

0

प्रतिबिंब के साथ कुछ भी करने का सबसे तेज़ तरीका वास्तविक प्रतिबिंब API कक्षाओं को जब भी संभव हो कैश करना है।

Object o = ... 
BeanPropertyController c = BeanPropertyController.of(o); 

for (String propertyName : c.getPropertyNames()) { 
     if (c.access(propertyName) == null && 
      c.typeOf(propertyName).equals(String.class)) { 
       c.mutate(propertyName, ""); 
     } 
} 

जिस तरह से यह काम करता है: उदाहरण के लिए मैं बहुत हाल ही में एक अभी तक एक और-डायनामिक-POJO-जोड़तोड़ जो मेरा मानना ​​है कि उन चीजों हर कोई कुछ बिंदु जो मुझे यह करने के लिए सक्षम बनाता है पर कर समाप्त होता है में से एक है बनाया कि मूल रूप से वह एक नियंत्रक ऑब्जेक्ट है जो बीन के सभी गुणों को आलसी करता है (नोट: कुछ जादू शामिल हैं) और फिर वास्तविक नियंत्रक ऑब्जेक्ट जीवित होने तक उन्हें पुन: उपयोग करते हैं। मैं बस इतना कह सकता हूं कि विधि ऑब्जेक्ट्स को ही सहेजकर मैं उस चीज़ को एक तेज तेज चीज़ में बदलने में कामयाब रहा और मुझे इस पर गर्व है कि मुझे लगता है कि मैं कॉपीराइट को सॉर्ट करने का प्रबंधन कर सकता हूं।

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

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