Java में रिफ्लेक्शन और इंट्रोस्पेक्शन: जादू जो हर किसी के लिए उपलब्ध है
\n\nकल्पना करें कि आप एक प्रोग्रामर हैं जो ऐसा कोड लिखता है जो रनटाइम पर खुद का विश्लेषण कर सके। क्या यह साइंस फिक्शन जैसा लगता है? Java में यह हकीकत है, और इसे रिफ्लेक्शन (Reflection) कहते हैं।
\n\nजब मैं पहली बार Java में रिफ्लेक्शन से जुड़ा, तो इसकी ताकत ने मुझे चौंका दिया। सोचिए: आप एक क्लास को नाम से लोड कर सकते हैं, उसके सभी मेथड और फील्ड जान सकते हैं, और यहां तक कि एक प्राइवेट मेथड को भी कॉल कर सकते हैं जिसे क्लास के लेखक ने छिपाना चाहा था। यह एक इमारत के सभी दरवाजों की चाबी पाने जैसा है। कमाल है? बिल्कुल। खतरनाक? हां, वह भी।
\n\nइस लेख में हम जानेंगे कि Java में रिफ्लेक्शन और इंट्रोस्पेक्शन क्या है, यह कैसे काम करता है, और सबसे महत्वपूर्ण बात—इसे समझदारी से कैसे इस्तेमाल करें। बहुत सारा कोड, उदाहरण और व्यावहारिक सुझाव होंगे। चलिए शुरू करते हैं!
\n\nसरल शब्दों में Java में रिफ्लेक्शन क्या है
\n\nJava में रिफ्लेक्शन एक ऐसा तंत्र है जो प्रोग्राम को रनटाइम पर क्लासेस, इंटरफेसेस, मेथड और फील्ड के बारे में जानकारी प्राप्त करने की अनुमति देता है। इससे भी अधिक, रिफ्लेक्शन की मदद से आप ऑब्जेक्ट बना सकते हैं, मेथड कॉल कर सकते हैं और फील्ड के मान बदल सकते हैं, भले ही वे प्राइवेट हों।
\n\nऔर Java में इंट्रोस्पेक्शन क्या है? यह रिफ्लेक्शन का एक हिस्सा है जो केवल "झांकने" के लिए जिम्मेदार है: क्लास की संरचना के बारे में जानकारी प्राप्त करना, बिना उसे बदले। इंट्रोस्पेक्शन विश्लेषण है, रिफ्लेक्शन विश्लेषण + क्रिया है।
\n\nइस सब के केंद्र में java.lang.Class क्लास है। यह किसी भी ऑब्जेक्ट का "पासपोर्ट" है। जब JVM एक क्लास लोड करता है, तो वह एक Class ऑब्जेक्ट बनाता है जो सारी मेटाजानकारी संग्रहीत करता है।
Class ऑब्जेक्ट कैसे प्राप्त करें: तीन तरीके
\n\nरिफ्लेक्शन का जादू करने से पहले, Class ऑब्जेक्ट प्राप्त करना होगा। ये तीन मुख्य तरीके हैं:
// 1. .class के माध्यम से\nClass<String> stringClass = String.class;\n\n// 2. किसी ऑब्जेक्ट पर getClass() के माध्यम से\nString hello = "नमस्ते";\nClass<? extends String> helloClass = hello.getClass();\n\n// 3. Class.forName() के माध्यम से (सबसे लचीला)\ntry {\n Class<?> dynamicClass = Class.forName("java.util.ArrayList");\n} catch (ClassNotFoundException e) {\n e.printStackTrace();\n}\n\n\nतीसरा तरीका विशेष रूप से उपयोगी है जब क्लास का नाम कंपाइल टाइम पर ज्ञात न हो—उदाहरण के लिए, यह कॉन्फ़िगरेशन फ़ाइल या डेटाबेस से आता है।
\n\nइंट्रोस्पेक्शन: क्लास के अंदर झांकना
\n\nचलिए एक छोटी सी क्लास लिखते हैं और देखते हैं कि Java में इंट्रोस्पेक्शन की मदद से इसके बारे में क्या जाना जा सकता है।
\n\nimport java.lang.reflect.*;\n\npublic class ReflectionDemo {\n \n private String secret = "यह एक रहस्य है!";\n public int number = 42;\n \n public void publicMethod() {\n System.out.println("पब्लिक मेथड");\n }\n \n private void privateMethod() {\n System.out.println("प्राइवेट मेथड");\n }\n \n public static void main(String[] args) throws Exception {\n // Class ऑब्जेक्ट प्राप्त करें\n Class<?> demoClass = Class.forName("ReflectionDemo");\n \n System.out.println("=== क्लास का नाम ===");\n System.out.println(demoClass.getName());\n \n System.out.println("\\n=== सभी फील्ड ===");\n Field[] fields = demoClass.getDeclaredFields();\n for (Field field : fields) {\n System.out.println(field.getName() + " : " + field.getType().getSimpleName());\n }\n \n System.out.println("\\n=== सभी मेथड ===");\n Method[] methods = demoClass.getDeclaredMethods();\n for (Method method : methods) {\n System.out.println(method.getName() + "()");\n }\n \n System.out.println("\\n=== कंस्ट्रक्टर ===");\n Constructor<?>[] constructors = demoClass.getDeclaredConstructors();\n for (Constructor<?> constructor : constructors) {\n System.out.println(constructor);\n }\n }\n}\n\n\nइसे चलाने पर