2012-02-17 9 views
24

यह अच्छी तरह से एक बेवकूफ सवाल हो सकता है, लेकिन मैं जावा के लिए नया हूँ, इसलिए ...मैं getConstructor (पैराम्स) का उपयोग कैसे करूं। NewInstance (args)?

मैं वर्तमान में कुछ कोड जहां वर्तमान में, clazz.asSubclass(asSubclassOfClass).getConstructor().newInstance() किया जा रहा है मिल गया है। मुझे इसके लिए कुछ तर्क पारित करने की आवश्यकता है, इसलिए मैं इसे बदलना चाहता हूं: clazz.asSubclass(asSubclassOfClass).getConstructor(params).newInstance(args)। जो मुझे समझ में नहीं आता है वह मुझे पैराम्स के रूप में पारित करने की आवश्यकता है और मुझे तर्क के रूप में क्या करने की आवश्यकता है। मान लीजिए कि मैं एक स्ट्रिंग "हाउडी" में टाइप करना चाहता था और एक्सवाईजेड के कुछ ऑब्जेक्ट को XyzObj कहा जाता था। मैं इसे कैसे निर्दिष्ट करूं? मैं पैराम्स के रूप में क्या पास करूंगा और मैं तर्क के रूप में क्या पास करूंगा?

उत्तर

38

जावा में इस Reflection कहा जाता है में हैं का प्रयोग करेंगे।

कक्षा का मानना ​​है कि यह कन्स्ट्रक्टर है, अन्यथा आपको एक NoSuchMethod अपवाद मिलेगा जो मुझे विश्वास है।

clazz.asSubclass(asSubclassOfClass) 
    .getConstructor(String.class,XYZ.class) 
    .newInstance("howdy",XyzObj); 

जब से तुम जावा के लिए नए हैं, तो यह है कि आप समझ सकते हैं क्या हुड के नीचे हो रहा है जब आप ऐसा करते हैं मुझे आप एक आसान दे।

मान लें आप निम्नलिखित वर्ग है:

public class ParentClazz{ 
     String someVar; 
    public ParentClazz(){ 
     someVar="test"; 
    } 
    public ParentClazz(String someVar){ 
     System.out.println("I have been invoked"); 
     this.someVar=someVar; 
    } 
} 

तो आप निम्नलिखित मुख्य विधि है:

public static void main(String[] args) throws ParseException, IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { 
      ParentClazz.class.asSubclass(ParentClazz.class).getConstructor(String.class).newInstance("howdy"); 
    } 

आप इस चलाते हैं तो आप कंसोल आउटपुट प्रिंट संदेश देखेंगे - मैं लागू कर दिया गया है । इसका मतलब है कि प्रतिबिंब का उपयोग करके आपने पेरेंटक्लाज़ के निर्माता को बुलाया है।

ParentClazz clazz = new ParentClazz("howdy"); 

आशा इसकी सहायता से आप यह समझ:

आप परिदृश्य की अनुमति देता है आप मानक वस्तु बनाने की प्रक्रिया का उपयोग करना है, तो एक ही बात कर सकते हैं।

+2

अंग्रेजी में है, पैरामीटर की एक सरणी है तर्क (एस) की कक्षा (एस), जबकि तर्क वास्तविक तर्क (ओं) की एक सरणी है। – Neil

1

आप clazz.asSubclass(asSubclassOfClass).getConstructor(String.class, XYZ.class).newInstance("howdy", XyzObj);

3
clazz.asSubclass(asSubclassOfClass).getConstructor(String.class, XYZ.class).newInstance("howdy", XyzObj) 

कौन मानता है कि निर्माता आर्ग निर्दिष्ट क्रम

4

यहां नए कीवर्ड के बिना कक्षाएं बनाने का एक उदाहरण दिया गया है। कक्षाएं प्राइमेटिव्स और ऑब्जेक्ट्स दोनों को अपने पैरामीटर के रूप में अन्य कक्षाएं लेती हैं। उदाहरण भी पता चलता है एक उपवर्ग के कहने और एक जनक वर्ग बनाया जा रहा

public class ConstructorInstantiateWithoutNew 
{ 
    @SuppressWarnings("rawtypes") 
    public static void main(String [] args) 
    { 
     Class<Drinker> clazz_drinker = Drinker.class; 
     Class [] paramTypes = { Fizz.class, Colour.class, int.class }; 
     Object [] paramValues = { new Fizz(), new Colour(), new Integer(10) }; 

     Class<Drunk> clazz_drunk = Drunk.class; 
     Class [] paramTypesSub = { Fizz.class, Colour.class, int.class, boolean.class }; 
     Object [] paramValuesSub = { new Fizz(), new Colour(), new Integer(10), true }; 

     try 
     { 
      Drinker drinker = clazz_drinker.getConstructor(paramTypes).newInstance(paramValues); 
      drinker.drink(); 

      Drunk drunk = clazz_drunk.getConstructor(paramTypesSub).newInstance(paramValuesSub); 
      drunk.drink(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

class Drinker 
{ 
    int n; 

    public Drinker(Fizz f, Colour c, int n) 
    { 
     this.n = n; 
    } 

    public void drink() 
    { 
     System.out.println("Dad drank " + (n*10) + " ml"); 
    } 
} 

class Drunk extends Drinker 
{ 
    boolean trouble; 
    public Drunk(Fizz f, Colour c, int n, boolean inDogHouse) 
    { 
     super(f,c,n); 
     trouble = inDogHouse; 
    } 

    public void drink() 
    { 
     System.out.println( 
       "Dad is Grounded: " + trouble + 
       " as he drank over "+ 
       (n*10) + " ml"); 
    } 
} 

class Fizz {} class Colour {} 

आशा इस उपयोगी

तरह का संबंध

नरेश महाराज

संबंधित मुद्दे