A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法。

            main接受的参数中含有要执行的类名,调用该类的main方法: Class.forName(" 类名").getMethod("main",String[ ].class).invoke(null,"");

            代码如下:
class test{
        public static void main(String[] args){
                System.out.println("test.main()");
                for(int i=0;i<args.length;i++)
                        System.out.println(args[i]);
        }
}
import java.lang.reflect.*;
class callmain{
        public static void main(String[] args){
                try{
                        Class.forName(args[0]).getMethod("main",String[].class).invoke(null,new Object[]{new String[]{"aa","bb","cc"}});
                }catch(ClassNotFoundException e){
                        throw new RuntimeException(e);
                  }catch(NoSuchMethodException e){
                        throw new RuntimeException(e);
                  }catch(IllegalAccessException e){
                        throw new RuntimeException(e);
                }catch(InvocationTargetException e){
                        throw new RuntimeException(e);
                }
        }
}分析Class.forName(args[0]).getMethod("main",String[].class).invoke(null,new Object[]{new String[]{"aa","bb","cc"}});

        在调用invoke()方法时,需要传入方法所需的参数。main()方法所需参数类型为String[],即字符串数组。如果写成这样的形式invoke(null,"aa","bb","cc")JDK1.5按照所定义的形式Object invoke(Object obj, Object... args) 将参数解释为可变参数类型,将传给test.main()方法三个字符串参数,与所需的字符串数组类型不匹配,如果转向低版本JDK1.4去解释,JDK1.4是将invoke()传递的参数打包成Object[]类型,即对象数组类型,也不匹配。

        如果写成这样的形式invoke(null,new String[ ]{"aa","bb","cc"})JDK1.5同样认为是打包好的可变参数形式,不匹配,转向JDK1.4解释,而JDK需要Object数组类型,String[]是字符串数组类型,两者不匹配。

        只能写成这样的形式invoke(null,new Object[]{new String[ ]{"aa","bb","cc"}}),首先JDK1.5解包,发现数组元素只有一个String[],匹配。

        或者写成这样的形式invoke(null,(Object)new String[ ]{"aa","bb","cc"}),JDK1.5将解释成一个Object变量,传递给所需的String[ ],类型转型成功,匹配。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马