黑马程序员技术交流社区

标题: 关于主函数的反射 [打印本页]

作者: 李挺    时间: 2013-2-27 13:52
标题: 关于主函数的反射
本帖最后由 李挺 于 2013-2-27 14:41 编辑
  1. public class Test2 {
  2.     public static void main(String argv[]) throws Exception {
  3.            
  4.         Method methodmain=Test1.class.getMethod("main", String[].class);
  5.         methodmain.invoke(null, null);
  6.         
  7.     }
  8. }
复制代码
为什么主函数的反射不能写成这样的?
为什么必须将这个被反射的函数的名字写在主函数的参数位置上
  1. public static void main(String[] args)throws Exception {
  2.   String startingClass=args[0];         /*得到java后面的参数*/
  3.   Method mainMethod=Class.forName(startingClass).getMethod("main", String[].class);
  4.   mainMethod.invoke(null, (Object)new String[]{"abc","def","ghi"});
  5. }
复制代码
为什么呢?

作者: lzw123451    时间: 2013-2-27 14:30
本帖最后由 李志卫 于 2013-2-27 14:33 编辑
  1. import java.lang.reflect.Method;



  2. public class Test23
  3. {
  4.     public static void main(String argv[]) throws Exception
  5.                 {
  6.            
  7.                         Method methodmain=Test1.class.getMethod("main", String[].class);
  8.                         methodmain.invoke(null,(Object)new String[]{"abc"});
  9.                         
  10.       }
  11. }


  12. class Test1
  13. {
  14.    public static void main(String argv[])
  15.                 {
  16.            
  17.             System.out.println(argv[0]);
  18.         
  19.     }
  20. }
复制代码
这样做的确可以,
但不要忘了,用反射的目的,如果要如上面那样做的话,知道要调用类Test1的主函数的话,直接用Test1.mian()就行了,不用用到反射。
用反射的原因是,你写程序的时候根本不知道这个Test1(要调用类)的名字,要从第二地方传一个类进来,这个类的名字你不知道,内容也不知道,只知道要传的参数。
如张老师的那个程序,你就可以任意传一个有主函数的类进去,只要这个类能接受这个参数。
这是我理解的要用反射的原因,这里。
作者: 李挺    时间: 2013-2-27 18:26
李志卫 发表于 2013-2-27 14:30
这样做的确可以,
但不要忘了,用反射的目的,如果要如上面那样做的话,知道要调用类Test1的主函数的话,直 ...

如果我要反射的是无参的构造函数呢?
作者: lzw123451    时间: 2013-2-27 19:07
李挺 发表于 2013-2-27 18:26
如果我要反射的是无参的构造函数呢?
  1. import java.lang.reflect.Method;

  2. public class Test6

  3. {

  4.     public static void main(String argv[]) throws Exception

  5.                 {
  6.                         Method methodmain=Test.class.getMethod("main", String[].class);

  7.                         methodmain.invoke(null,(Object)new String[]{null});  //或者null不填也可以.

  8.       }

  9. }



  10. class Test

  11. {

  12.    public static void main(String argv[])

  13.                 {

  14.             System.out.println("haha");

  15.     }

  16. }
复制代码
如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。

如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。

上面两句是API中关于invoke()参数的原话。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2