写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法? 示例代码: import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class RefectTest { public static void main(String args[]) throws Exception { /**Method类*/ Method charAt = str.getClass().getMethod("charAt", int.class); System.out.println(charAt.invoke(str, 1)); System.out.println(charAt.invoke(str, new Object[]{2}));//用jdk1.4的方式进行调用,Object数组长度为1 //invoke:对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。 //如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。 因为静态方法时不需要对象的! System.out.println(str.getClass().getMethod("valueOf", float.class).invoke(null, 12.3f)); /**Method的高级应用: 写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法?*/ //常用方式:TestArguments.main(new String[]{"abc","def","ghi"}); String startingMainClass = args[0]; //参数为将要运行的java类名,main方法的参数为字符串数组 Method mainMethod = Class.forName(startingMainClass).getMethod("main", String[].class); //invoke为方法的调用,main方法为static方法,所以第一个参数为null //第一种:将字符串转换成Object对象。注意每一个的数组父类都是Object。 //就相当于跟编译器说:我是一个Object对象不是一个数组,不要给我拆包了! mainMethod.invoke(null, (Object)new String[]{"abc","def","ghi"}); //第二种:将字符串数组作为Object数组中的一个元素 mainMethod.invoke(null, new Object[]{new String[]{"abc","def","ghi"}}); } } class TestArguments{ public static void main(String args[]){ for(String arg :args){ System.out.println(arg); } } } |