हाल ही में एक प्रोजेक्ट जिस पर मैंने काम किया है, हाल ही में जावा 7 से जावा 8 पर स्विच किया गया है। मैं उन इंटरफेस को ढूंढने में सक्षम होना चाहता हूं जिनके पास हमारे कोड बेस में कार्यात्मक इंटरफेस पेश करने के लिए अभ्यर्थियों के रूप में एक सार तत्व है। (@FunctionalInterface
के रूप में मौजूदा इंटरफेस को एनोटेट करना, java.util.function
में इंटरफ़ेस से उन्हें विस्तारित करना, या संभवतः उन्हें बस बदलना)।मैं इंटरफेस के लिए जावा कोड बेस कैसे खोज सकता हूं जिसमें एक विधि है?
उत्तर
reflections प्रोजेक्ट क्लासपाथ पर सभी कक्षाओं को ढूंढने और वापस करने में सक्षम है।
ReflectionUtils.forNames(new Reflections(new ConfigurationBuilder().setScanners(new SubTypesScanner(false))
.addUrls(ClasspathHelper.forClassLoader()))
.getAllTypes()).stream()
.filter(Class::isInterface)
.collect(toMap(c -> c,
c -> Arrays.stream(c.getMethods())
.filter(m -> !m.isDefault())
.filter(m -> !Modifier.isStatic(m.getModifiers()))
.filter(m -> !isObjectMethod(m))
.collect(toSet())))
.entrySet().stream()
.filter(e -> e.getValue().size() == 1)
.sorted(comparing(e -> e.getKey().toString()))
.map(e -> e.getKey().toString() + " has single method " + e.getValue())//getOnlyElement(e.getValue()))
.forEachOrdered(System.out::println);
isObjectMethod
सहायक इस तरह परिभाषित किया गया है:
private static final Set<Method> OBJECT_METHODS = ImmutableSet.copyOf(Object.class.getMethods());
private static boolean isObjectMethod(Method m){
return OBJECT_METHODS.stream()
.anyMatch(om -> m.getName().equals(om.getName()) &&
m.getReturnType().equals(om.getReturnType()) &&
Arrays.equals(m.getParameterTypes(),
om.getParameterTypes()));
}
यह मदद नहीं करता है तुम वापस स्रोत कोड के लिए जाने के लिए और एनोटेशन जोड़ने, लेकिन यह आपको दे देंगे यहाँ एक काम कर उदाहरण दिया गया है से काम करने के लिए एक सूची।
क्या होगा यदि इंटरफ़ेस 'ऑब्जेक्ट' की विधि को ओवरराइड करता है, जैसे 'तुलनाकर्ता' करता है? फिर, विधि को फ़िल्टर किया जाना चाहिए। और 'स्थिर 'विधियों को भी हटाया जाना चाहिए। या बेहतर, बस फिल्टर को 'अमूर्त' विधियों को पास करने दें। और 'धाराओं (स्प्लिटरेटर (c.getMethods(), 0), झूठी)' Arrays.stream (c.getMethods()) के बजाय 'का उपयोग करने का कोई कारण है? – Holger
आपकी टिप्पणियों के साथ अपडेट किया गया –
'.filter (m -> Modifier.isAbstract (m.getModifiers()) '' .filter (m ->! M.isDefault()) के बजाय 'फ़िल्टर (एम ->! Modifier.isStatic (m.getModifiers())) '? – Holger
- 1. मैं विधि संदर्भों के लिए जावा आईडीई खोज परिणामों के लिए कैसे कर सकता हूं?
- 2. मैं दो इंटरफेस को कैसे कार्यान्वित कर सकता हूं जिसमें समान नाम वाले विधियां हों?
- 3. मैं .NET के लिए Google कस्टम खोज API के साथ एक खोज कैसे कर सकता हूं?
- 4. मैं एंड्रॉइड इरादा कैसे बना सकता हूं जिसमें डेटा है?
- 5. मैं फ़ंक्शन के लिए हैकेज पैकेज कैसे खोज सकता हूं?
- 6. एक कोड बेस
- 7. मैं "और" के लिए कार्यान्वयन कोड कैसे देख सकता हूं?
- 8. मैं एक शब्दकोश कैसे बना सकता हूं जिसमें सी #
- 9. मैं कक्षा कोड पर अपना कोड कैसे चला सकता हूं?
- 10. क्या मैं पर्ल में जावा जैसी इंटरफेस बना सकता हूं?
- 11. जावा अनुप्रयोग के लिए वेब उपयोगकर्ता इंटरफेस
- 12. मैं जावा में एक अमूर्त विधि की तरह जेएस में एक विधि कैसे बना सकता हूं?
- 13. एक ही कोड बेस
- 14. vim - मैं बफर कैसे खोज सकता हूं?
- 15. क्या जावा 8 विधि संदर्भ के लिए फ्लाई पर इंटरफेस लागू कर सकता है?
- 16. एक इंटरफेस जावा पावरमोकिटो
- 17. मैं जावा से .NET कोड कैसे कॉल कर सकता हूं?
- 18. मैं एम्बेडेड संसाधन के "पथ" को कैसे खोज सकता हूं?
- 19. मैं वीबी.नेट में एक सरणी कैसे खोज सकता हूं?
- 20. मैं सी ++ में इंटरफेस कैसे अनुकरण कर सकता हूं?
- 21. मैं एक मोंगो डेटाबेस की संरचना कैसे खोज सकता हूं
- 22. मैं बाहरी जावास्क्रिप्ट फ़ाइल को कैसे शामिल कर सकता हूं जिसमें शीतलन कोड है?
- 23. मैं एक अपवाद कैसे बढ़ा सकता हूं जिसमें यूनिकोड स्ट्रिंग शामिल है?
- 24. मैं फ़ाइल से एक पीएनजी छवि कैसे लोड कर सकता हूं जिसमें एक और एक्सटेंशन है?
- 25. सी # में बेस कन्स्ट्रक्टर को कॉल करने के लिए मैं कैसे मजबूर कर सकता हूं?
- 26. एक ही कोड बेस
- 27. मैं जावा कोड में एक मौजूदा लेआउट के भीतर एक छवि दृश्य कैसे बना सकता हूं?
- 28. क्या मैं एक गतिशील विधि के लिए स्रोत कोड को रूबी प्रिंट कर सकता हूं?
- 29. एक ही कोड बेस
- 30. मैं एसओएलआर में सभी फ़ील्ड कैसे खोज सकता हूं जिसमें कीवर्ड शामिल हैं।
यह इंटेलिजे में एक निरीक्षण के रूप में उपलब्ध है। एक निरीक्षण प्रोफ़ाइल बनाएं जिसमें केवल यह निरीक्षण हो, और इसे अपने प्रोजेक्ट पर चलाएं। –
इस परिवर्तन के रूप में केस-दर-केस विश्लेषण की आवश्यकता होगी, और, एनोटेशन जोड़ने के अलावा, अन्य 2 समाधानों को महत्वपूर्ण रिफैक्टरिंग की आवश्यकता होती है, मैं इसके लिए नहीं जाऊंगा। यदि आप लाइब्रेरी डिज़ाइन नहीं कर रहे हैं, तो एनोटेशन जोड़ने से अधिक मूल्य प्रदान नहीं होता है, क्योंकि यदि आप लम्बाडा कार्यान्वयन करते हैं तो इंटरफ़ेस को एक गैर-कार्यात्मक में परिवर्तित करते हैं तो आप संकलन समस्याओं को तुरंत देखेंगे। –