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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李挺 中级黑马   /  2013-2-27 13:52  /  1702 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李挺 于 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. }
复制代码
为什么呢?

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 李志卫 于 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 14:30
这样做的确可以,
但不要忘了,用反射的目的,如果要如上面那样做的话,知道要调用类Test1的主函数的话,直 ...

如果我要反射的是无参的构造函数呢?
回复 使用道具 举报
李挺 发表于 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()参数的原话。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马