package cn.itcast.Enumeration;
public class TextArguments {
/**
* @param args
*/
public static void main(String[] args) {
for(String s:args){
System.out.println(s);
}
}
}
String arg=args[0];
Method mainMethod = Class.forName(arg).getMethod("main", String[].class);//找不到“TextMain”的异常,forName()
// 方法要完整的类名,就是包名加类名的字符串。
// mainMethod.invoke(null, new String[]{"你好","hello,world!","very good!"});//" wrong number of arguments",这是因为
// invoke()方法里有多参数引起的,1.4里的多参是以数组的表示的,而1.5以后是以“...”的形式表示。但是main方法只能接受一个String[]类型,这样编译器
// 会报错。解决的方法有一下几种为了向下兼容,所以编译器采用
// 1.4规范,这样String[]就会先分为三个String类型的参数传递给main方法,
mainMethod.invoke(null, new Object[] {new String[]{"你好","hello,world!","very good!"}});//因为编译器要根据1.4规范
// 将数组先拆分一次,所以就把String[]数组存放到Object[]中,让编译器去拆分。
mainMethod.invoke(null, (Object) new String[] {"sss","yyy","jjj"});//把String[]强转换为Object对象,编译器发现是一个
// 对象时,就不会去拆分它。
我觉得上面的那道题和下面的那道题在理解上有矛盾。
int[] a = new int[] {45,68,23,15};
String[] s = new String[]{"abc","ssjiala"};
System.out.println(a);
System.out.println(s);
System.out.println(Arrays.asList(a));
System.out.println(Arrays.asList(s));
运行结果:[I@18a992f
[Ljava.lang.String;@4f1d0d
[[I@18a992f]
[abc, ssjiala]
之所以打出来的是[[I@18a992f],是因为在1.4版中asList()方法是就多参的,以
Object[]来表示,一个一维的int数组是一个Object对象,而不是Object数组,
1.5版中的多参是以“...”表示的,于是把a做为一个int数组存储到List中,也没有把它分成一个一个int数存进去。是int数组打印出来的应该就地址。
传入main方法的是String[] args,传入asList方法的1.5版是asList(T... a),1.4版是asList(Object[] a),那为什么传new String[]{"你好","hello,world!","very good!"}),要理解“为了向下兼容,所以编译器采用1.4规范,这样String[]就会先分为三个String类型的参数传递给main方法,”呢?如果这样理解就和后面的那道题相矛盾。“System.out.println(Arrays.asList(s));”中为什么不把s才分成两个字符串传给asList,报IllegalArgumentException异常呢?
请高手解答一下。 |