反射调用main方法注意事项

尽管在通过反射调用一个类的main方法是,获取main方法与获取普通方法一样的步骤,但是在调用main方法,传递参数时需要注意。

public class MainRef {
	
	public static void main(String[] args) throws Exception{
		Method method =MainArguments.class.getMethod("main",String[].class);
		//这种写法会出粗
		//method.invoke(null, new String[]{"1","2","3"});
	}

}

class MainArguments{
	public static void main(String[] args) {
		for(String s:args){
			System.out.println(s);
		}
	}
}
代码中注释掉的那句,按道理没错啊。main方法接收的不就是一个字符串数组么,但是jdk的语法为了向上兼容,我们在把一个字符串数组传递过去的时候,系统会默认认为我们是把参数包裹成一个数组传递过去,得到该数组后,它会把数组按内容进行分割,这样说来,我们代码中传递过去得其实就是三个字符串了,所以会报错。解决办法:

一:

method.invoke(null, new Object[]{new String[]{"1","2","3"}});
这样我们把数组包裹进数组,系统获得之后将Object数组拆开,发现是个String数组,就把它当做main方法的参数执行。

二:

method.invoke(null, (Object)new String[]{"1","2","3"});
将String字符串强转为Object,这样main方法接收到,一看是一个对象,就不会再进行拆分,则可将该字符串数组传递过去。

你可能感兴趣的:(反射调用main方法注意事项)