दिलचस्प पोस्ट
तिथि (डेटस्ट्रिंग) और नए दिनांक (डेटस्ट्रिंग) के बीच अंतर सी # सेट संग्रह? एस्पनेट एमवीसी 2 – एक मॉडल की संपत्ति को एक अलग नामांकित मान से बाँधें जावा में एक अर्रे पर सूची का उपयोग कब करना है? मैक-वन्य और सही फ़ॉरवर्डिंग बंडल कायल का मतलब क्या है? सी # WinForms में एक ListBox के DataSource को रीफ्रेश कैसे करें कैसे दो निर्दिष्ट तारीख के बीच की तारीखों को खोजने के लिए? JSON में, प्रत्येक नाम का उद्धरण क्यों है? आर में कॉलम-वैक्टर की सूची में मैट्रिक्स कैसे परिवर्तित करें? जावास्क्रिप्ट: डॉम लोड इवेंट्स, एक्जिक्यूटशन अनुक्रम, और $ (डॉक्यूमेंट) .ready () बाहरी HTTP अनुरोधों को कैसे बनायें Node.js Gcloud क्लाइंट के बिना Google कंटेनर रजिस्ट्री का उपयोग करें गिट हुक: क्या एक क्लोन हुक है? पोस्ट इंडेरमेंट ऑपरेटर लूप के लिए में वृद्धि नहीं कर रहा है

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

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

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

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

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

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

वेब के समाधान से एकत्रित समाधान "एक विधि पैरामीटर का नाम प्राप्त करना"

पैरामीटर नाम उपलब्ध हैं यदि आपने कंपाइलर को शामिल करने के लिए कहा है (डीबग जानकारी के साथ संकलन करें)। स्प्रिंग 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") रूप में आप पैरामीटरों को एनोटेट कर सकते हैं और नाम पास कर सकते हैं। बाद में आप इसे से एनोटेशन प्राप्त करने और पैरामीटर नाम प्राप्त करने में सक्षम होंगे।