本帖最后由 马镱洵 于 2012-9-21 03:16 编辑
"//我的疑问一是需要的是String[].class 也就是需要String类型的数组,传递的参数是new String[] { "abc" )就不可以了呢?虽然老师有解释,我认为不清楚}"
不是不可以,而是因为你没有给你的Test的类的main()方法传递参数,传递参数要这样传递,假设你用的eclipse:
如果你是在命令行运行Test类,那么就这样传递参数:
java Test DefineMain
这样你的程序就不会有问题了.
"我的疑问二,我自己还有个思路,事实证明可行,可不知道为什么要用上面的方法呢??
Method mainMethod = MyDefineMain.class.getMethod("main", String[].class);"
Method mainMethod = MyDefineMain.class.getMethod("main", String[].class);
这样写法就不科学了,你是自己知道你有个MyDefineMain类,那可以这样写.要是你不知道你有MyDefineMain类呢,那你如何获得你不知道类名的类的字节码信息呢.那就只有用Class.forName()方法了啊,这样可以在运行时,自己写"包名.类名"的完全限定名,就可以随意取得任何类的字节码信息了.
"mainMethod.invoke(null, (Object) new String[] { "abc" });//这里不考虑上面的问题,我的意思就是 干嘛要弄那么麻烦,又是args[0]了,又是运行Test里的main方法时,加个全路径的类名参数了。。。。"
public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
看吧,第二个参数是要求你传入一个Class类型的可变参数...
此处省略1000字,不废话了,直接说重点,这里有个细节要注意:
只要是在反射中调用方法,若方法中实际传入的参数的类型是数组或可变参数,这就要分两种情况来讨论:
1 如果参数是基本数据类型的数组或可变参数,就可以不用Object数组来包装(也不必要将最后结果强转为Object),例如:
mainMethod.invoke(null, new int[] { 222 });
2 如果参数是引用类型的数组或可变参数,就必须要用Object数组来包装(也可以将最后结果强转为Object),例如:
mainMethod.invoke(null, new Object[] { new Integer[] { 222 } });
或
mainMethod.invoke(null, (Object) new Integer[] { 222 });
人家就是要考验你们对从命令行传入参数的技能掌握的如何,对Class.forName()方法掌握的如何,所以才会这样玩.
现在把给你修改后的代码发出来:- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- class DefineMain {
- public static void main(String[] args) {
- System.out.println("我是自定义类的主方法" + args[0]);
- }
- }
- public class Test {
- public static void main(String[] args) {
- // DefineMain.main(new String[]{"abc"});// 自定义方法之前是这样调用的
- String str = args[0];// 如果没有传参数进来,则不能这么赋值
- Method mainMethod = null;
- try {
- mainMethod = Class.forName(str).getMethod("main", String[].class);
- mainMethod.invoke(null, new Object[] { new String[] { "abc" } });
- // ★★★★★★
- // 我的疑问一是需要的是String[].class 也就是需要String类型的数组,
- // 传递的参数是new String[] {"abc")就不可以了呢?虽然老师有解释,我认为不清楚}
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- }
- }
复制代码 |