2009-05-21 34 views
19

मैं जावा प्रतिबिंब को समझने की कोशिश कर रहा हूं और गैर-इंटीजर सेटर विधियों के साथ काम करते समय कठिनाइयों का सामना कर रहा हूं।कक्षा प्रतिबिंब के साथ जावा प्रतिबिंब getDeclaredMethod()

उदाहरण के तौर पर, मैं नीचे "getDeclaredMethod()" कॉल को कैसे हल कर सकता हूं?

import java.lang.reflect.*; 

class Target { 
    String value; 

    public Target() { this.value = new String("."); } 
    public void setValue(String value) { this.value = value; } 
    public String getValue() { return this.value; } 
} 

class ReflectionTest { 
    public static void main(String args[]) { 
     try { 
      Class myTarget = Class.forName("Target"); 

      Method myMethod; 
      myMethod = myTarget.getDeclaredMethod("getValue"); // Works! 
      System.out.println("Method Name: " + myMethod.toString()); 

      Class params[] = new Class[1]; 
      //params[0] = String.TYPE; // ?? What is the appropriate Class TYPE? 
      myMethod = myTarget.getDeclaredMethod("setValue", params); // ? Help ? 
      System.out.println("Method Name: " + myMethod.toString()); 

     } catch (Exception e) { 
      System.out.println("ERROR"); 
     } 
    } 
} 
+0

मेरे लिए एक प्रश्न है, किस परिदृश्य में, मैं यह जानने की कोशिश करूंगा कि कक्षा और चर में कौन सी विधियां हैं? मैं यह जानने की कोशिश क्यों करूंगा? मैं इस विधियों का उपयोग करने के कारणों की खोज कर रहा हूं, हटाए गए मोड(), getDeclaredFields(), आदि ... क्या आप कृपया सुझाव दे सकते हैं – gmhk

+0

प्रतिबिंब का उपयोग करने के लिए एक (यादृच्छिक) कारण यह है कि यदि आप एक जेसन सीरियलाइजेशन/deserialization लाइब्रेरी बनाना चाहते हैं। प्रसिद्ध Google जीसन लाइब्रेरी अपने कार्यों को प्राप्त करने के लिए भारी प्रतिबिंब का उपयोग करती है। ऐसे उपयोगों के उदाहरण हमेशा के लिए जारी रह सकते हैं। उदाहरण के लिए आप एक नेटवर्क प्रोटोकॉल का निर्माण कर सकते हैं जिसका उपयोग आप किसी अन्य एप्लिकेशन को क्रमबद्ध करने और विभिन्न जावा ऑब्जेक्ट गुणों को भेजने के लिए कर सकते हैं या किसी अन्य भाषा के आधार पर एक सर्वर पर जो सभी कक्षाओं के लिए एक धारावाहिक विधि को लागू नहीं करने के लिए बड़ी मात्रा में बचत कर सकते हैं अदला बदली। –

उत्तर

20
params[0] = String.class; 

String पर class का उपयोग Class<?> कि String वर्ग के साथ जुड़ा हुआ है वापस आ जाएगी।

+4

उह। मैं बेवकूफ़ हूँ। धन्यवाद! – Nate

+1

(ओह, मेरा मतलब टिप्पणी को ऊपर उठाना नहीं था!) ​​ मैं सिर्फ यह जोड़ना चाहता था कि मुझे दूसरे दिन इसके बारे में पता नहीं था, इसलिए यह बिल्कुल स्पष्ट नहीं है। – coobird

+0

मेरे लिए एक प्रश्न है, किस परिदृश्य में, मैं यह जानने की कोशिश करूंगा कि कक्षा और चर में कौन सी विधियां हैं? मैं यह जानने की कोशिश क्यों करूंगा? मैं इस विधियों का उपयोग करने के कारणों की खोज कर रहा हूं GetDeclaredMethod(), getDeclaredFields(), आदि ... क्या आप सुझाव दे सकते हैं – gmhk