黑马程序员技术交流社区

标题: Java基础加强反射疑问 [打印本页]

作者: 黑马振鹏    时间: 2012-7-3 20:15
标题: Java基础加强反射疑问
本帖最后由 啸傲江湖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也能得到字节码?

作者: 周朋飞    时间: 2012-7-3 21:46
那必须的啊 首先我给你讲一下为什么要用反射
当你做一个软件可以安装插件的功能,你连插件的类型名称都不知道,你怎么实例化这个对象呢?
因为程序是支持插件的(第三方的),在开发的时候并不知道 。所以,无法在代码中 New出来 ,但反射可以,通过反射,动态加载程序集,然后读出类,检查标记之后再实例化对象,就可以获得正确的类实例。
反射的目的就是为了扩展未知的应用。比如你写了一个程序,这个程序定义了一些接口,只要实现了这些接口的dll都可以作为插件来插入到这个程序中。那么怎么实现呢?就可以通过反射来实现。就是把dll加载进内存,然后通过反射的方式来调用dll中的方法。
很多工厂模式就是使用的反射。

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

这里你看你的main函数是不是有一个参数String[]args 这就说明 你传进来的参数必须是字符串类型的啊 ,还有这个字符串是你运行的时候才传进来的 ,赋给一个字符串这样才方便下面的操作 因为Class.forName接受的就是一个字符串 你可以看一下我的帖子  有很详细的关于反射的说明
作者: 车风波    时间: 2012-7-3 22:45
这样写不行吧。args是一个长度为0的数组,args[0]就越界了。
作者: 黑马张扬    时间: 2012-7-4 09:35
只是为了提高阅读性!你直接写Class.forName(args[0])也是可以的, String startingClassName = args[0],写这一句就是为了说明args[0]其实是一个类名,也就是传进来的第一个参数是一个类名,把这个类名赋值给startingClassName, Class.forName("类名")不就是Class.forName(startingClassName)吗,只不过这个类名不是你固定写好的,是通过参数传进来的!




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