दिलचस्प पोस्ट
रीशरर शिकायत करता है कि विधि स्थिर हो सकती है, लेकिन नहीं कैसे एक चार सरणी का उपयोग करें और ऊपरी मामले में लोअर केस अक्षरों को बदलने के लिए, और इसके विपरीत क्या कोई कार्यविधि के दूसरे तर्क को आंशिक रूप से लागू कर सकता है जो कोई कुंजीशब्द तर्क नहीं लेता है? जीसीसी कमांड लाइन का उपयोग करते हुए। सी फ़ाइल से फ़ाइल बनाएँ यदि कई बार सर्विस शुरू हो जाती है तो क्या होता है? django MultiValueDictKeyError त्रुटि, मैं इसे कैसे से निपटूं? Maven pom.xml से अप्रयुक्त निर्भरता को निकालने का एक आसान तरीका है? टेम्पलेट स्पेशलाइजेशन और सक्षम_आईफ़ एंड्रॉइड में बाहरी फोंट का उपयोग करें मैं किसी अन्य C ++ .exe से .exe कैसे खोलूं? एक बंद (मानक) स्ट्रीम को फिर से खोलना संभव क्यों नहीं है? कैसे IE8 वेबब्राउज़र नियंत्रण में प्रोग्रामिंग बंद quirks मोड? सी # में स्थिर तरीकों के लिए औपचारिक मापदंडों में "इस" कीवर्ड का उपयोग Play Framework 2.0 में एक कस्टम सत्यापनकर्ता कैसे बनाया जाए? कैसे जुड़ें (मर्ज) डेटा फ़्रेम (आंतरिक, बाहरी, बाएं, दाएं)?

एक इंटरफ़ेस को कार्यान्वित करने वाले जावा वर्गों का पता लगाएं

कुछ समय पहले, मैं कोड के एक टुकड़े पर आया था, जो किसी विशिष्ट इंटरफ़ेस को कार्यान्वित करने वाली कक्षाओं का पता लगाने के लिए कुछ मानक जावा कार्यक्षमता का इस्तेमाल करता था। मुझे पता है कि कार्यों को कुछ गैर-तार्किक जगह में छिपाया गया था, लेकिन वे अन्य वर्गों के लिए इस्तेमाल किया जा सकता है क्योंकि पैकेज नाम निहित है वापस तो मुझे इसकी ज़रूरत नहीं थी, इसलिए मैं इसके बारे में भूल गया था, लेकिन अब मैं करता हूं, और मुझे फिर से कार्य मिल रहा नहीं लगता। ये कार्य कहां पाया जा सकता है?

संपादित करें: मैं किसी भी IDE फ़ंक्शंस या कुछ भी नहीं देख रहा हूं, बल्कि कुछ ऐसा जो जावा अनुप्रयोग के भीतर निष्पादित किया जा सकता है।

Solutions Collecting From Web of "एक इंटरफ़ेस को कार्यान्वित करने वाले जावा वर्गों का पता लगाएं"

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

मैंने अपने पैकेज को ओपन सोर्स लाइब्रेरी में रखा है जो मेरी वेब साइट पर है I पुस्तकालय यहां है: http://software.clapper.org/javautil/ आप क्लासफेंडर क्लास के साथ शुरू करना चाहते हैं।

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

लाइब्रेरी बीएसडी-लाइसेंस प्राप्त है, इसलिए आप इसे अपने कोड के साथ सुरक्षित रूप से बंडल कर सकते हैं। स्रोत उपलब्ध है

यदि यह आपके लिए उपयोगी है, तो अपने आप को मदद करें

अद्यतन करें: यदि आप स्काला का उपयोग कर रहे हैं, तो आपको यह लाइब्रेरी अधिक स्काला-मैत्रीपूर्ण होने के लिए मिल सकती है।

वसंत आपके लिए यह कर सकता है …

BeanDefinitionRegistry bdr = new SimpleBeanDefinitionRegistry(); ClassPathBeanDefinitionScanner s = new ClassPathBeanDefinitionScanner(bdr); TypeFilter tf = new AssignableTypeFilter(CLASS_YOU_WANT.class); s.addIncludeFilter(tf); s.scan("package.you.want1", "package.you.want2"); String[] beans = bdr.getBeanDefinitionNames(); 

NB TypeFilter महत्वपूर्ण है अगर आप सही परिणाम चाहते हैं! आप इसके बजाय यहां बहिष्करण फ़िल्टर का भी उपयोग कर सकते हैं।

स्कैनर वसंत-संदर्भ जार में पाया जा सकता है, वसंत-सेम में रजिस्ट्री, प्रकार फिल्टर वसंत-कोर में है

मुझे ऐसा करने के लिए वास्तव में प्रतिबिंब पुस्तकालय पसंद है

यह कई प्रकार के स्कैनर प्रदान करता है ( getTypesAnnotatedWith , getSubTypesOf , आदि), और यह लिखना या अपना खुद का विस्तार करना आसान है

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

जावा के पिछले संस्करणों में इसके कुछ कार्यान्वयन हैं, लेकिन सूर्य संकुल में कोर एपीआई में नहीं है (मुझे लगता है कि ऐसा कुछ ऐसा वीडियो है जो इमेजआईओआई के लिए आंतरिक है)। जैसा कि कोड सरल है, मैं गैर-मानक सन कोड पर निर्भर होने के बजाय अपने खुद के कार्यान्वयन की सिफारिश करता हूं जो कि परिवर्तन के अधीन है

पैकेज स्तर की एनोटेशन

मुझे पता है कि इस प्रश्न का पहले ही बहुत समय पहले उत्तर दिया गया है लेकिन इस समस्या का दूसरा समाधान पैकेज स्तरीय एनोटेशन का उपयोग करना है।

हालांकि इसकी बहुत मुश्किल है कि जेवीएम में सभी वर्गों को खोजने के लिए वास्तव में पैकेज पदानुक्रम को ब्राउज़ करना आसान है।

 Package[] ps = Package.getPackages(); for (Package p : ps) { MyAno a = p.getAnnotation(MyAno.class) // Recursively descend } 

तो बस अपनी टिप्पणी को कक्षा की एक सरणी के तर्क है। फिर एक विशेष पैकेज के लिए अपने पैकेज- info.java में MyAno डाल दिया।

अगर लोग दिलचस्पी रखते हैं तो मैं अधिक विवरण (कोड) जोड़ूंगा, लेकिन संभवत: ये विचार प्राप्त होगा।

मेटाइंफ सर्विस लोडर

@ एरिकसन के उत्तर में जोड़ने के लिए आप सर्विस लोडर दृष्टिकोण का उपयोग भी कर सकते हैं। कोहसुके में सर्विस लोडर दृष्टिकोण के लिए आपको आवश्यक मेटा-आईएनएफ सामान बनाने का एक शानदार तरीका है:

http://weblogs.java.net/blog/kohsuke/archive/2009/03/my_project_of_t.html

आप एक्स्टेंसिबल कंपोनेंट स्कैनर (एक्स्टोस: http://sf.net/projects/extcos ) का उपयोग भी कर सकते हैं और इस तरह एक अंतरफलक को लागू करने वाले सभी वर्गों को खोज सकते हैं:

 Set<Class<? extends MyInterface>> classes = new HashSet<Class<? extends MyInterface>>(); ComponentScanner scanner = new ComponentScanner(); scanner.getClasses(new ComponentQuery() { @Override protected void query() { select(). from("my.package1", "my.package2"). andStore(thoseImplementing(MyInterface.class).into(classes)). returning(none()); } }); 

यह फ़ाइल सिस्टम पर वर्गों के लिए काम करता है, जार के अंदर और यहां तक ​​कि उन लोगों के लिए जो जेबस वर्चुअल फ़ाइल सिस्टम पर। इसे और भी स्टैंडअलोन अनुप्रयोगों के साथ-साथ किसी भी वेब या ऐप्लिकेशन कंटेनर के भीतर काम करने के लिए डिज़ाइन किया गया है।

पूर्ण सामान्य तौर पर, यह कार्यकुशलता असंभव है जावा क्लासलोडर तंत्र केवल एक विशिष्ट नाम के साथ एक वर्ग (pacakge सहित) पूछने की क्षमता की गारंटी देता है, और क्लासलोडर क्लास की आपूर्ति कर सकता है, या यह बता सकता है कि वह उस क्लास को नहीं जानता है।

क्लासेस दूरस्थ सर्वर से लोड (और अक्सर) हो सकते हैं, और वे उड़ने पर भी तैयार किए जा सकते हैं; यह क्लासलोडर लिखने में बिल्कुल मुश्किल नहीं है जो एक वैध वर्ग देता है जो आपके द्वारा पूछे गये किसी भी नाम के लिए दिए गए इंटरफेस लागू करता है; उस इंटरफ़ेस को लागू करने वाली कक्षाओं की एक सूची तब लंबाई में अनंत हो जाएगी

व्यवहार में, सबसे आम मामला एक URLClassLoader जो कि फाइल सिस्टम निर्देशिकाओं और JAR फाइलों की सूची में वर्गों को दिखता है। तो आपको URLClassLoader प्राप्त करने की ज़रूरत है, फिर उन निर्देशिकाओं और अभिलेखागारों के माध्यम से URLClassLoader , और प्रत्येक वर्ग फ़ाइल के लिए जिसे आप उनसे मिलते हैं, संबंधित Class ऑब्जेक्ट का अनुरोध करें और इसके getInterfaces() विधि की वापसी के माध्यम से देखें।

जाहिर है, क्लास.इस एसेग्नेबलफॉम () आपको बताता है कि क्या एक अलग-अलग कक्षा दिए गए अंतरफलक लागू करता है। तो फिर समस्या का परीक्षण करने के लिए कक्षाओं की सूची हो रही है।

जहां तक ​​मुझे मालूम है, जावा लोडर से "वर्गों की सूची जिसे आप संभवतः लोड कर सकते हैं" के लिए पूछने के लिए जावा से कोई सीधा रास्ता नहीं है। तो आपको दृश्य जार के माध्यम से फिर से यह स्वयं करना होगा, क्लास को लोड करने के लिए क्लास। फोर्नाम () को बुलाते हैं, फिर इसे जांचना।

हालांकि, यदि आप वास्तव में लोड किए गए इंटरफेस को लागू करने वाले कक्षाएं जानना चाहते हैं, तो यह थोड़ा आसान है:

  • जावा इंस्ट्रूमेंटेशन फ्रेमवर्क के माध्यम से, आप Instrumentation.getAllLoadedClasses () को कॉल कर सकते हैं
  • प्रतिबिंब के माध्यम से, आप किसी दिए गए कक्षा लोडर के क्लासलालोडर वर्ग वर्गों से पूछ सकते हैं।

यदि आप इंस्ट्रूमेंटेशन तकनीक का उपयोग करते हैं, तो (जैसा कि लिंक में बताया गया है) क्या होता है कि आपका "एजेंट" क्लास को अनिवार्य रूप से कहा जाता है जब JVM शुरू होता है, और एक इंस्ट्रुमेंटेशन ऑब्जेक्ट पास करता है उस बिंदु पर, आप शायद एक स्थिर फ़ील्ड में "इसे बाद में सहेजना" चाहते हैं, और उसके बाद अपना मुख्य एप्लिकेशन कोड लोडेड कक्षाओं की सूची प्राप्त करने के लिए बाद में कॉल करें।

अगर आप चल रहे कार्यक्रम के साथ काम करने के परिप्रेक्ष्य से पूछ रहे थे तो आपको java.lang * पैकेज को देखने की जरूरत है। यदि आप क्लास ऑब्जेक्ट प्राप्त करते हैं, तो आप isAssignableFrom विधि का उपयोग कर सकते हैं यह जांचने के लिए कि क्या यह अन्य कक्षा का इंटरफ़ेस है।

इनके लिए खोज के रास्ते में कोई सरल नहीं बनाया गया है, जैसे ईक्लीप्स इस जानकारी के सूचकांक का निर्माण करते हैं।

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

सिर्फ एक चेतावनी है कि ये तरीकों और कक्षाएं काफी धीमी गति से हो सकती हैं।