首页 文章

IllegalArgumentException:Java Constructor.newInstance()中的参数数量错误

提问于
浏览
6

考虑以下代码,

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());
    }
}

它出什么问题了?我得到以下例外:

线程“main”中的异常java.lang.IllegalArgumentException:sun.reflect.DelegatingConstructorAccessorImpl的sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)中的参数数量错误.newInstance(DelegatingConstructorAccessorImpl.java:27)位于com.test.StartUp.main的java.lang.reflect.Constructor.newInstance(Constructor.java:513)中(StartUp.java:10)

2 回答

  • 23

    您的 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 verbose选项来回答您的问题,并获得您需要的正确反射代码:

    $ 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());
        }
    }
    

相关问题