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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马振鹏 中级黑马   /  2012-7-3 20:15  /  1576 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 啸傲江湖007 于 2012-7-5 18:18 编辑

            String startingClassName = args[0];
            Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class);
第一句中的stratingClassName = args[0],不明白什么意思。args[0]代表main函数中参数数组的第一个参数,这个参数为什么要赋给一个字符串呢?
Class.forName(startingClassName).getMethod("main", String[].class);  Class.forName("类名")得到字节码 这里直接传入startingClassName也能得到字节码?

评分

参与人数 1技术分 +2 收起 理由
蒋映辉 + 2

查看全部评分

3 个回复

正序浏览
只是为了提高阅读性!你直接写Class.forName(args[0])也是可以的, String startingClassName = args[0],写这一句就是为了说明args[0]其实是一个类名,也就是传进来的第一个参数是一个类名,把这个类名赋值给startingClassName, Class.forName("类名")不就是Class.forName(startingClassName)吗,只不过这个类名不是你固定写好的,是通过参数传进来的!
回复 使用道具 举报
这样写不行吧。args是一个长度为0的数组,args[0]就越界了。
回复 使用道具 举报
那必须的啊 首先我给你讲一下为什么要用反射
当你做一个软件可以安装插件的功能,你连插件的类型名称都不知道,你怎么实例化这个对象呢?
因为程序是支持插件的(第三方的),在开发的时候并不知道 。所以,无法在代码中 New出来 ,但反射可以,通过反射,动态加载程序集,然后读出类,检查标记之后再实例化对象,就可以获得正确的类实例。
反射的目的就是为了扩展未知的应用。比如你写了一个程序,这个程序定义了一些接口,只要实现了这些接口的dll都可以作为插件来插入到这个程序中。那么怎么实现呢?就可以通过反射来实现。就是把dll加载进内存,然后通过反射的方式来调用dll中的方法。
很多工厂模式就是使用的反射。

我查了查资料,并且我仔细想了想,就好像我们张老师讲的一个题目,让你写一个程序去调另一个类的Main方法,假设你连类的名字都不知道,就给一串字符串,然后你也不知道这些字符串代表什么意思,没有关系,只要知道这些字符串肯定是一些java代码,只要加载到内存之后就是一些字节码,然后我们就可以通过字节码获得这串字符串的一些内容,譬如Main方法之类的 我是这么理解的

这里你看你的main函数是不是有一个参数String[]args 这就说明 你传进来的参数必须是字符串类型的啊 ,还有这个字符串是你运行的时候才传进来的 ,赋给一个字符串这样才方便下面的操作 因为Class.forName接受的就是一个字符串 你可以看一下我的帖子  有很详细的关于反射的说明
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马