दिलचस्प पोस्ट
जावा के लिए सर्वश्रेष्ठ XML पार्सर कुंजी के रूप में उपयोगकर्ता परिभाषित प्रकारों के साथ std :: नक्शे कॉमा और बिंदु के साथ दोगुनी करने के लिए स्ट्रिंग पार्स करें मैं आईफोन पर ओरिएंटेशन परिवर्तन पर वेब ऐप के पैमाने / ज़ूम कैसे रीसेट करूं? घातक कोर जब http: // स्थानीयहोस्ट मूल है MySQL में अगले ऑटो-इनेरमेंट आईडी कैसे प्राप्त करें I कैसे जावास्क्रिप्ट को रोकने के लिए हर? चयन वक्तव्य में मामला पायथन पूर्णांक ++ के साथ बढ़ते हुए एक एंड्रॉइड गतिविधि से ऑब्जेक्ट को किसी अन्य का उपयोग करने के लिए कैसे भेजा जा सकता है? डब्लूपीएफ में आवेदन कहाँ है? डूएन्ट्स () बैल-नोड के तहत त्रुटि उप वर्गों के उदाहरणों पर काम क्यों नहीं करता है? विशिष्ट आईडी मूल्यों के आधार पर MySQL आदेश क्यों नहीं logcat मेरे Android में कुछ भी दिखता है? सी # में सरणियों की समानता का परीक्षण करना

मैं जावा में इंटरफ़ेस प्रोग्राम के सभी कार्यान्वयन की एक सूची कैसे प्राप्त करूं?

क्या मैं इसे प्रतिबिंब या ऐसा कुछ कर सकता हूँ?

वेब के समाधान से एकत्रित समाधान "मैं जावा में इंटरफ़ेस प्रोग्राम के सभी कार्यान्वयन की एक सूची कैसे प्राप्त करूं?"

क्या एरिकसन ने कहा, लेकिन अगर आप अभी भी ऐसा करना चाहते हैं तो रिफ्लेक्शंस पर एक नज़र डालें अपने पृष्ठ से:

रिफ्लेक्शंस का उपयोग करने के लिए आप अपने मेटाडेटा से क्वेरी कर सकते हैं:

  • कुछ प्रकार के सभी उपप्रकार प्राप्त करें
  • सभी एनोटेशन के साथ सभी प्रकार की टिप्पणियां प्राप्त करें
  • सभी टिप्पणियां एनोटेशन के साथ मिलती हैं, एनोटेशन मापदंडों से मिलान करना
  • कुछ तरीकों के साथ कुछ विधियों को एनोटेट करें

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

यदि आप इसे से बचने के लिए चाहते हैं, तो आपको अपने स्वयं के क्लास फ़ाइल पार्सर को कार्यान्वित करने की ज़रूरत होगी जो प्रतिबिंब के बजाय अधिक कुशलता से संचालित होती है एक बाइट कोड इंजीनियरिंग पुस्तकालय इस दृष्टिकोण के साथ मदद कर सकता है

सेवा प्रदाता तंत्र एक प्लग-इन सेवा के कार्यान्वयन की गणना करने के लिए पारंपरिक साधन है। जावा 6 में ServiceLoader उपयोग करें, या पहले के संस्करणों में स्वयं को लागू करें। मैंने एक और जवाब में एक उदाहरण दिया है।

मैं थोड़ी देर के लिए खोज रहा हूं और वहां अलग-अलग दृष्टिकोण लगता है, यहां एक सार है:

  1. प्रतिबिंब पुस्तकालय काफी लोकप्रिय है अगर आप निर्भरता को जोड़ने में मन न रखें। यह ऐसा दिखेगा:

     Reflections reflections = new Reflections("firstdeveloper.examples.reflections"); Set<Class<? extends Pet>> classes = reflections.getSubTypesOf(Pet.class); 
  2. सर्विस लोधर (एरिकसन के उत्तर के अनुसार) और यह इस तरह दिखता है:

     ServiceLoader<Pet> loader = ServiceLoader.load(Pet.class); for (Pet implClass : loader) { System.out.println(implClass.getClass().getSimpleName()); // prints Dog, Cat } 

    ध्यान दें कि इसके लिए काम करने के लिए आपको Pet को एक ServiceProviderInterface (SPI) के रूप में परिभाषित करने और इसके कार्यान्वयन घोषित करने की आवश्यकता है। आप resources/META-INF/services में एक फ़ाइल नाम examples.reflections.Pet साथ बनाते हैं। resources/META-INF/servicesPet में Pet सभी क्रियान्वयन और घोषणाएं

     examples.reflections.Dog examples.reflections.Cat 
  3. पैकेज-स्तरीय एनोटेशन यहाँ एक उदाहरण है:

     Package[] packages = Package.getPackages(); for (Package p : packages) { MyPackageAnnotation annotation = p.getAnnotation(MyPackageAnnotation.class); if (annotation != null) { Class<?>[] implementations = annotation.implementationsOfPet(); for (Class<?> impl : implementations) { System.out.println(impl.getSimpleName()); } } } 

    और एनोटेशन परिभाषा:

     @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PACKAGE) public @interface MyPackageAnnotation { Class<?>[] implementationsOfPet() default {}; } 

    और आपको उस पैकेज के अंदर package-info.java नामक फ़ाइल में पैकेज-स्तरीय एनोटेशन घोषित करना होगा। यहां नमूना सामग्री हैं:

     @MyPackageAnnotation(implementationsOfPet = {Dog.class, Cat.class}) package examples.reflections; 

    ध्यान दें कि उस समय केवल क्लास लोडर के लिए ज्ञात पैकेज संकुल के लिए कॉल द्वारा लोड किए जाएंगे .getPackages Package.getPackages()

इसके अलावा, URLClassLoader पर आधारित अन्य तरीकों भी हैं जो हमेशा पहले से लोड किए गए वर्गों तक सीमित रहेंगी, जब तक आप निर्देशिका-आधारित खोज नहीं करते हैं

हां, पहला कदम उन सभी वर्गों की पहचान करना है, जिनके बारे में आप ध्यान रखते थे। यदि आपके पास पहले से ही यह जानकारी है, तो आप उनमें से प्रत्येक के बीच गणना कर सकते हैं और संबंध को मान्य करने के लिए उदाहरण का उपयोग कर सकते हैं। एक संबंधित लेख यहां है: http://www.javaworld.com/javaworld/javatips/jw-javatip113.html

क्या एरिकसन ने कहा सबसे अच्छा है यहां एक संबंधित प्रश्न और उत्तर धागा है – http://www.velocityreviews.com/forums/t137693-find-all-implementing-classes-in-classpath.html

अपाचे बीसीईएल पुस्तकालय आपको उन्हें लोड किए बिना कक्षाएं पढ़ने की अनुमति देता है। मेरा मानना ​​है कि यह तेज़ हो जाएगा क्योंकि आप सत्यापन चरण को छोड़ सकते हैं। क्लासलोडर का इस्तेमाल करते हुए सभी कक्षाओं को लोड करने की दूसरी समस्या यह है कि आपको एक विशाल मेमोरी असर पड़ेगा और अनजाने में किसी भी स्थिर कोड ब्लॉक को चलाया जाएगा जो आप शायद नहीं करना चाहते हैं

अपाचे बीसीईएल पुस्तकालय लिंक – http://jakarta.apache.org/bcel/

इसके अलावा, यदि आप एक IDE प्लगइन (जहां आप करने की कोशिश कर रहे हैं अपेक्षाकृत आम है) लिख रहे हैं, तो आईडीई आम तौर पर आपको उपयोगकर्ता कोड की वर्तमान स्थिति के वर्ग पदानुक्रम तक पहुंचने के लिए अधिक प्रभावी तरीके प्रदान करता है।

स्प्रिंग को यह प्राप्त करने का एक बहुत आसान तरीका है:

 public interface ITask { void doStuff(); } @Component public class MyTask implements ITask { public void doStuff(); } 

फिर आप टाइप की सूची autowire कर सकते हैं ITask और वसंत सभी कार्यान्वयन के साथ इसे आबाद होगा:

 @Service public class TaskService { @Autowired private List<ITask> tasks; } 

मैं एक ही मुद्दे में भाग गया मेरा समाधान एक ObjectFactory वर्ग में सभी तरीकों की जांच करने के लिए प्रतिबिंब का उपयोग करना था, जिससे उन लोगों को नष्ट कर दिया गया जो मेरे बाध्य POJOs में से किसी एक के उदाहरण लौटने के लिए XXX () विधियां नहीं बनाते थे इस प्रकार की प्रत्येक कक्षा को एक श्रेणी [] सरणी में जोड़ा जाता है, जो तब जेएसीएसीसीएनटीएक्सटीएस्टियल कॉल के लिए भेजा गया था। यह अच्छी तरह से काम करता है, केवल ऑब्जेक्टफ़ैक्टर्स वर्ग को लोड करने की ज़रूरत है, जो कि वैसे भी आवश्यक होना था। मुझे ऑब्जेक्टफैक्चर वर्ग को बनाए रखने की ज़रूरत है, यह एक काम है जो हाथ से किया जाता है (मेरे मामले में, क्योंकि मैं पीओओओ के साथ शुरू किया था और स्कीमाजेन का उपयोग किया था) या xjc द्वारा आवश्यक रूप से उत्पन्न किया जा सकता है किसी भी तरह, यह प्रदर्शनकारी, सरल और प्रभावी है