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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马十八期0513 中级黑马   /  2013-1-18 12:24  /  1222 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Demo2{
    public static void main(String []args) throws Exception{
       /*      
       Test t =new Test();
       Method mainMethod =Test.class.getMethod("main",String[].class);
        mainMethod.invoke(t,(Object)new String[]{"123","234","345","456"});
       */
        String startingClassName =args[0];
       Method mainMethod =Class.forName(startingClassName).getMethod("main",String[].class);
       mainMethod.invoke(null,(Object)new String []{"123","234","345"});
      }
}
class Test{
public static void main(String []args){
     for(String arg:args){
        System.out.println(arg);
         }
    }
}
张孝祥老师讲的这段运行主函数的代码,我有好几个地方都看不明白,还请大家帮我解答。
1 String startingClassName =args[0]; 这里的args[0]指的应该是Demo2主函数里的字符串数组的第一个字符串元素吧?主函数里的args[]字符串没有被初始化,默认的值应该是null才对。Class.forName(startingClassName)也就等于Class.forName(null),应该会报空指针异常才对啊!
2 mainMethod.invoke(null,(Object)new String []{"123","234","345"})main方法虽然是静态的,可以传入null。但是如果传入了null,怎样来确定到底是调用了哪个主函数呢?
3 在运行方式里面设置运行配置,将自变量x设置成Test,这个是什么意思?有什么用处?张孝祥老师说这个相当于java Demo2 Test,那么java Demo2 Test又代表什么?这个知识点是被我忽略了还是毕老师的视频里没有讲?

评分

参与人数 1技术分 +1 收起 理由
高境 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
本帖最后由 张向辉 于 2013-1-18 18:43 编辑

首先1,若果java运行时没有给主函数传入参数,args[0]会报数组角标越界异常
2,mathod在封装时已经指定Class, Method mainMethod =Test.class.getMethod("main",String[].class);
所以只能调用Test中的主函数
3,自变量X是什么 真没明白  建议你再看遍视频 肯定会有收获
回复 使用道具 举报
楼主说的x应该是(x)=Arguments,这个是配置类main方法的初始参数的,在里面写入Test就相当于Demo2的args[0]="Test",
Class.forName(startingClassName)就不会报错了
mainMethod.invoke(null,(Object)new String []{"123","234","345"});请注意mainMethod的由来:
Method mainMethod =Class.forName(startingClassName).getMethod("main",String[].class);
Class.forName()这个方法是指JVM查找并加载指定的类,然后getMethod就是类本身得到自己的方法,最后invoke调用自己的方法。
整理一下,什么是反射,就是把java类中的所有成分都映射成相应的java类。注意这句话代表的是一个过程,Test这个类是由虚拟机直接找到的,然后调用方法,要知道到了虚拟机阶段就是程序外了,相当于是Test找到了自己的方法并调用,肯定参数是null,

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 黑马张英涛 于 2013-1-18 20:51 编辑

第一个问题:
args[0]指的是你运行Demo2的main方法时给他传递的第一个参数,如果你运行时不给他传递参数,那么args应该为null,这时候你执行 String startingClassName =args[0],就相当于取null的第一个元素,自然会报角标越界异常,后面的Class.forName(startingClassName)根本不会执行,所以是角标越界而不是空指针异常。
第二个问题:
静态方法就是可以通过类名直接调用。一个类中的静态方法名字都是唯一的,上面
Method mainMethod =Class.forName(startingClassName).getMethod("main",String[].class);这行代码已经给你确定了类名和方法名,那么你得到的这个mainMethod就是唯一的一个方法,传不传null都无所谓了,你就是个new 了个对象传进去也是这个方法。
第三个问题:
那个自变量就是你给这个方法传递的参数。在命令行模式下你运行程序不是用
c:\>java Demo2的形式么?要给这个类的主方法传递参数就是c:\>java Demo2 arg1 arg2 arg3 ... argn 的这种形式,由于我们用的eclipse是集成的环境,不需要敲命令,所以这个自变量就是用来给程序传递参数用的。这里这个java Demo2 Test中的Test就相当于arg1,只是他恰好又是个类名而已。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

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