用反射方式执行某个类中的main()方法。
目标:写一个程序,这个程序能够根据用户提供的类名,去执行该 类的main方法。
问题:
启动java程序的main方法的参数是一个字符串数组,即public static void main(String[] args),通过反射方式来调用这个main方法时,如何
为invoke方法传递参数呢?按jdk1.5的语法,整个数组是一个参数,而按jdk1.4的语法 ,数组中的每个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac会到底按照哪种语法进行呢?
jdk1.5肯定要兼容jdk1.4的语法 ,会按jdk1.4的语法进行处理,即把数组打散成为若干个单独的参数。所以,在给main方法传递参数时,不能使用代码。
mainMethod.invoke(null,new Sring[]{"xxxx"}),java只把它当作jdk1.4的语法进行理解。
而不把它当作jdk1.5语法解释,因此会出现参数类型不对的问题。
解决方法:
mainMethod.invoke(null,new Object()[new String[]{"xx"}])。
mainMethod.invoke(null,new Object()[new String[]{"xx"}]),编译器会作特殊处理,编译时不把参数当作数组看待,也就不会数组打散成若干 个参数了。
class TestArguments{
public static void main(String[] args){
for(String arg : args){
System.out.println(arg);
}
}
//TestArguments.main(new String[]{"111","222","333"});
String startingClassName = args[0];
Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class);
//mainMethod.invoke(null, new Object[]{new String[]{"111","222","333"}});
mainMethod.invoke(null, (Object)new String[]{"111","222","333"});
<--------------------------数组与Object的关系及其反射类型------------------------------------------->
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。
代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class
基本类型的一维数组可以被当作Object类型作用,不能当作Object[]类型使用,非基本类型的一维数组,即
可以当做object类型使用,又可以当做object[]类型使用。
int [] a1 = new int[]{1,2,3};
int [] a2 = new int[4];
int[][] a3 = new int[2][3];
String [] a4 = new String[]{"a","b","c"};
System.out.println(a1.getClass() == a2.getClass());
System.out.println(a1.getClass() == a4.getClass());
System.out.println(a1.getClass() == a3.getClass());
System.out.println(a1.getClass().getName());
System.out.println(a1.getClass().getSuperclass().getName());
System.out.println(a4.getClass().getSuperclass().getName());
Arrays.asList()方法处理int[]和String[]时的差异。
Object aObj1 = a1;
Object aObj2 = a4;
//Object[] aObj3 = a1;
Object[] aObj4 = a3;
Object[] aObj5 = a4;
System.out.println(a1);
System.out.println(a4);
System.out.println(Arrays.asList(a1));
System.out.println(Arrays.asList(a4));
Array工具类用于完成对数组的反射操作。
需求:怎么得到数组中的元素类型?
private static void printObject(Object obj) {
Class clazz = obj.getClass();
if(clazz.isArray()){
int len = Array.getLength(obj);
for(int i=0;i<len;i++){
System.out.println(Array.get(obj, i));
}
}else{
System.out.println(obj);
}
}
printObject(a4);
printObject("xyz");