जावा परावर्तन काफी शक्तिशाली है और बहुत उपयोगी हो सकता है। जावा परावर्तन , संकलित समय पर वर्गों, विधियों आदि के नामों को जाने बिना , रनटाइम के दौरान कक्षाओं, इंटरफेस, फ़ील्ड और विधियों का निरीक्षण करना संभव बनाता है । प्रतिबिंब का उपयोग करके नई वस्तुओं को त्वरित करना, तरीकों को लागू करना और फ़ील्ड मान प्राप्त करना / सेट करना भी संभव है ।
एक त्वरित जावा परावर्तन उदाहरण आपको यह दिखाने के लिए कि प्रतिबिंब का उपयोग क्या दिखता है:
Method[] methods = MyObject.class.getMethods();
for(Method method : methods){
System.out.println("method = " + method.getName());
}
यह उदाहरण MyObject नामक कक्षा से क्लास ऑब्जेक्ट प्राप्त करता है। क्लास ऑब्जेक्ट का उपयोग करके उदाहरण से उस क्लास में विधियों की एक सूची प्राप्त होती है, विधियों को पुनरावृत्त करता है और उनके नामों को प्रिंट करता है।
वास्तव में यह सब कैसे यहाँ समझाया गया है
संपादित करें : लगभग 1 वर्ष के बाद मैं इस उत्तर को संपादित कर रहा हूं क्योंकि प्रतिबिंब के बारे में पढ़ते हुए मुझे प्रतिबिंब के कुछ और उपयोग मिले।
- वसंत सेम विन्यास का उपयोग करता है जैसे:
<bean id="someID" class="com.example.Foo">
<property name="someField" value="someValue" />
</bean>
जब स्प्रिंग संदर्भ इस <सेम> तत्व को संसाधित करता है, तो वह उस क्लास को तत्काल करने के लिए "com.example.Foo" तर्क के साथ Class.forName (स्ट्रिंग) का उपयोग करेगा।
यह फिर <संपत्ति> तत्व के लिए उपयुक्त सेटर प्राप्त करने के लिए प्रतिबिंब का उपयोग करेगा और इसके मूल्य को निर्दिष्ट मूल्य पर सेट करेगा।
- जूनिट विशेष रूप से निजी / संरक्षित विधियों के परीक्षण के लिए प्रतिबिंब का उपयोग करता है।
निजी तरीकों के लिए,
Method method = targetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);
निजी क्षेत्रों के लिए,
Field field = targetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);