दिलचस्प पोस्ट
जावास्क्रिप्ट में फ्लैट सरणी से पेड़ सरणी बनाएं एपेंड मोड के साथ जावा फ़्रीवेयर विंडोज संदेशों में हुक सेट करना Codeigniter में WHERE खंडों को समूहित करना जेसन। नेट (न्यूटन्सफ्ट। जेसन) – दो नाम 'समान' नाम हैं? एंड्रॉइड स्टूडियो – प्रोसेस डीबग संसाधनों में विफल रहा ईआर आरेखों में सुपर- और उपप्रकार के संबंध तालिकाओं के रूप में कैसे प्रदर्शित होते हैं? सी ++ में यादृच्छिक दोहरी संख्या उत्पन्न करें पायथन लॉगर नामकरण आपके होस्ट मशीन में सॉफ़्टवेयर द्वारा एक स्थापित कनेक्शन निरस्त कर दिया गया था HTTP बहु-भाग (POST) अनुरोध में सीमा पैरामीटर क्या है? जावास्क्रिप्ट अलर्ट का शीर्षक बदलें एंड्रॉइड में कई स्क्रीन समर्थन OWIN सुरक्षा – OAuth2 रीफ़्रेश टोकन्स को कैसे कार्यान्वित करें I ASP.NET MVC में एक फाइल देखने / डाउनलोड करने के लिए रिटर्निंग

एक विधि पैरामीटर का नाम प्राप्त करना

जावा 6 में , मुझे निम्नलिखित विधि हस्ताक्षर की कल्पना करें:

public void makeSandwich(Bread slice1, Bread slice2, List<Filling> fillings, boolean mustard) 

मैं जानना चाहता हूं, रनटाइम पर, मूल्य जिसे slice2 या किसी अन्य पैरामीटर पर पारित किया गया था, यहाँ महत्वपूर्ण बिट यह है कि मैं पैरामीटर नाम से मान प्राप्त करना चाहता हूं।

मुझे पता है कि getParameterTypes या getGenericParameterTypes साथ पैरामीटर प्रकारों की सूची कैसे प्राप्त करें।

आदर्श रूप से मैं प्रकार के बजाय पैरामीटर नामों की सूची प्राप्त करना चाहता हूं। ऐसा करने का एक तरीका है?

Solutions Collecting From Web of "एक विधि पैरामीटर का नाम प्राप्त करना"

पैरामीटर नाम उपलब्ध हैं यदि आपने कंपाइलर को शामिल करने के लिए कहा है (डीबग जानकारी के साथ संकलन करें)। स्प्रिंग ParameterNameDiscoverer जो आपको नाम प्राप्त करने में मदद कर सकता है। ऐसा करने के लिए डिफ़ॉल्ट कार्यान्वयन asm ClassReader का उपयोग करता है

javac साथ आपको डीबग जानकारी को शामिल करने के लिए -g तर्क को शामिल करना चाहिए। ग्रहण के साथ मुझे लगता है कि यह डिफ़ॉल्ट रूप से है; इसे प्राथमिकताओं का उपयोग करके कॉन्फ़िगर किया जा सकता है: जावा -> कंपाइलर और उसके बाद "पैरामीटर के बारे में जानकारी स्टोर करें (प्रतिबिंब के माध्यम से प्रयोग करने योग्य)" (यह भी देखें)।

कुछ फ्रेमवर्क इस का उपयोग करते हैं उदाहरण के लिए स्प्रिंग-एमवीसी के पास @RequestParam जो परम नाम के लिए डिफ़ॉल्ट है, यदि रिजोल्यूबल। यह स्पष्ट नामकरण का भी समर्थन करता है – @RequestParam("foo") यदि कोई डीबग जानकारी प्रदान नहीं की गई है।

इस प्रश्न के उत्तर देने के बाद मुझे एक और समाधान मिला है। समाधान परामानर है

उदाहरण:

  Method method = Foo.class.getMethod(...); Paranamer paranamer = new CachingParanamer(); String[] parameterNames = paranamer.lookupParameterNames(method) // throws ParameterNamesNotFoundException if not found // or ... parameterNames = paranamer.lookupParameterNames(method, false) // will return null if not found 

जावा पैरामीटर नामों में प्रतिबिंब के माध्यम से उपलब्ध नहीं हैं

यह नहीं हो सकता। कक्षा फ़ाइलों में तर्क नाम शामिल नहीं है, जैसा कि आप अपने आईडीई की स्वत: पूर्णता के साथ देख सकते हैं जब स्रोत उपलब्ध नहीं है

इसलिए, प्रतिबिंब एपीआई पैरामीटर नामों को देने में सक्षम नहीं है।

इस उत्तर के अतिरिक्त: "पैरामीटर नाम उपलब्ध हैं यदि आपने उन्हें शामिल करने के लिए संकलक को बताया है"

यदि आप ईक्लीपसे का उपयोग कर रहे हैं -> प्रॉपर्टीज -> जावा कम्पाइलर -> जांच करें "विधि पैरामीटर के बारे में जानकारी स्टोर करें (प्रतिबिंब के द्वारा प्रयोग करने योग्य)

आप पैरामीटर के मूल्य को दूसरे मान के लिए निर्दिष्ट कर सकते हैं

 Bread slice2; public void makeSandwich(Bread slice1, Bread slice2, List<Filling> fillings, boolean mustard) { this.slice2 = slice2; System.out.println(this.slice2.getSomething()); } 

क्या आपके पास विधि का कोड है? पैरामीटर @Param("slice1") रूप में आप पैरामीटरों को एनोटेट कर सकते हैं और नाम पास कर सकते हैं। बाद में आप इसे से एनोटेशन प्राप्त करने और पैरामीटर नाम प्राप्त करने में सक्षम होंगे।