2011-02-28 11 views
5

निम्नलिखित कोड पर विचार करें में तर्कों की गलत संख्या,IllegalArgumentException: जावा Constructor.newInstance()

public class StartUp { 

    public StartUp(String[] test){} 

    public static void main(String[] args) throws Exception{ 
     Constructor cd = StartUp.class.getConstructor(String[].class); 
     System.out.println(cd.newInstance(new String[]{}).toString()); 
    } 
} 

इसके साथ क्या गलत है?

धागा "मुख्य" java.lang.IllegalArgumentException में अपवाद:: मैं निम्नलिखित अपवाद मिल sun.reflect.NativeConstructorAccessorImpl.newInstance पर sun.reflect.NativeConstructorAccessorImpl.newInstance0 (मूल निवासी विधि) पर बहस की गलत संख्या (NativeConstructorAccessorImpl.java:39) sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:27) पर java.lang.reflect.Constructor.newInstance (Constructor.java:513) पर com.test.StartUp.main पर (StartUp.java:10)

उत्तर

21

आपका String[] को Object[] पर स्पष्ट रूप से परिवर्तित किया जा रहा है और एक खाली सरणी के रूप में एक तर्क के बजाय, तर्कों की एक खाली सरणी के रूप में लिया गया है। इस प्रयास करें:

Object arg = new String[0]; 
System.out.println(cd.newInstance(arg).toString()); 

या

System.out.println(cd.newInstance(((Object)new String[0]).toString()); 

या यहां तक ​​कि बिल्कुल आप के लिए सरणी बनाने के लिए होने से बचने के संकलक:

System.out.println(cd.newInstance(new Object[] { new String[0] }).toString()); 

मूल रूप से इस से निपटने varargs और सरणी का एक मिश्रण है कॉन्वर्स :(

-1

आप अपने खोजी का उत्तर देने के लिए dp4j वर्बोज विकल्प का उपयोग कर सकते हैं पर, और आपको सही प्रतिबिंब कोड प्राप्त करने की आवश्यकता है:

$ vim ReflectedAcces.java 
class StartUp { 

    private StartUp(String[] test){} 

} 

public class ReflectedAcces{ 

     @com.dp4j.InjectReflection 
    public static void main(String[] args) throws Exception{ 
       StartUp su = new StartUp(new String[]{}); 
       System.out.println(su.toString()); 
    } 

} 


$ javac -cp dp4j-1.0-jar-with-dependencies.jar -Averbose=true ReflectedAcces.java 
... 
ReflectedAcces.java:10: Note: 
class StartUp { 

    private StartUp(String[] test) { 
    } 
} 
public class ReflectedAcces { 

    public ReflectedAcces() { 
     super(); 
    } 

    @com.dp4j.InjectReflection() 
    public static void main(String[] args) java.lang.ClassNotFoundException, java.lang.NoSuchFieldException, java.lang.IllegalAccessException, java.lang.NoSuchMethodException, java.lang.reflect.InvocationTargetException, java.lang.InstantiationException { 
     final java.lang.reflect.Constructor startUpConstructor = Class.forName("StartUp").getDeclaredConstructor(.java.lang.String[].class); 
     startUpConstructor.setAccessible(true); 
     StartUp su = (.StartUp)startUpConstructor.newInstance(new .java.lang.Object[1][]{new String[]{}}); 
     System.out.println(su.toString()); 
    } 
}