反射的确是java中很厉害的一项技术,但在main方法的反射中却不能按照常规那样反射,举例说明:
class Student
{
public static void sa(int num)
{
System.out.println(num);
}
public static void main(String [] args)
{
System.out.println("main");
}
}
对于上面的sa方法,我只需使用如下代码:
public void test5()throws Exception
{
Class clazz=Class.forName("cn.lcu.day01.Student");
Method m=clazz.getMethod("sa", int.class);
m.invoke(null, 20);
}
就能得到结果20
但如果用如下代码反射main方法的话,则会报异常:java.lang.IllegalArgumentException: wrong number of arguments
public void test6()throws Exception
{
Class clazz=Class.forName("cn.lcu.day01.Student");
Method m=clazz.getMethod("main", String[].class);
//m.invoke(null, (Object)new String[]{"aa","bb"});
//m.invoke(null, new Object[]{new String[]{"aa","bb"}});
m.invoke(null, new String[]{"aa","bb"});
}
这是因为在java升级过程中,会兼容1.4版本,而1.4版本反射的时候用的是数组参数,
1.4 Method.invoke(Object obj, Object obj[])
1.5 Method.invoke(Object obj, object ...obj)
这样的话,invoke中传入的String数组会被拆开,成("aa","bb"),所以就会报上边的异常。
解决方法: m.invoke(null, (Object)new String[]{"aa","bb"});
或者 m.invoke(null, new Object[]{new String[]{"aa","bb"}});