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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

反射这块好难啊,哪位同学给讲解下这三句代码,
String startingClassName = args[0];
Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class);
mainMethod.invoke(null, new Object[]{new String[]{"1111","22222","33333"}});
还有高新技术第23篇中张老师讲的往run里面加路径是怎莫回事

评分

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

查看全部评分

4 个回复

倒序浏览
本帖最后由 高亮亮 于 2014-1-4 17:56 编辑

我进度还没有赶到张孝祥老师的反射那块,只自己学了下Class类.但后面run那个问题你问的我没太弄明白需求.就看看第一个问题吧.

针对你给的三个代码,真好检测下我学的程度,可能分析的不正确,欢迎指正.谢谢.

String startingClassName = args[0];
这句话就是生命一个字符串变量startingClassName,指向 main方法(就是主方法)参数列表中的那个数组中索引为0的元素(一个字符串).
说实话这句代码不知道存在有什么意义?还非常有可能造成空指针异常,因为一般主方法里面那个String[]默认是个空数组

Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class);
这句话就是利用反射机制的多个操作:
Class.forName(startingClassName)-->获取该类的Class对象.
.getMethod("main",String[].class)-->获取上一步得到的Class对象中一个名为:"main",参数列表中参数为:一个String[]数组的方法.(其实就是main()方法)
Method mainMethod =-->这里就是声明一个java反射中专门用来封装一个方法的Method对象mainMethod,接收了上一步的结果.


mainMethod.invoke(null, new Object[]{new String[]{"1111","22222","33333"}});
调用Methodinvoke(Class<?>...)方法,通过反射机制,给该Method内封装的方法传递参数,获得该方法该参数初始化后运行的结果.
其中的null,就是用来接收这个运行结果的对象.当然,main方法是静的,用null,完全ok.
后面的参数new Object[]{new String[]{"1111","22222","33333"}},就是给main(String[] args)传入了一个Object[]数组.?这是为什么呢?
这里我也纠结了一会,突然想通了.必须得说下因为jdk1.5的一个新特性:可变参数.所以,不能直接传入一个String[]数组,要不他就将他当作三个String参数了.
所以再仔细分析这个Object[]数组,他后面给了赋值,就是内部第一个索引为0的元素为一个new String[]{"1111","22222","33333"},就是相当于将Object[]数组当作可变参数进行传递,实际上,传递是一个String[]数组,即:new String[]{"1111","22222","33333"}.
好了,这个时候,参数传递正确,就完成了句代码.

评分

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

查看全部评分

回复 使用道具 举报 1 0
高亮亮 发表于 2014-1-4 17:53
我进度还没有赶到张孝祥老师的反射那块,只自己学了下Class类.但后面run那个问题你问的我没太弄明白需求.就 ...

Class.forName(startingClassName)-->获取该类的Class对象的字节码吧
你分析的很透彻后面的两句我也都理解了,就是第一句代码跟后面的联系不起来。本来Class.forName("类名")是获取字节码的一种方式但是String startingClassName = args[0];怎么就成了类名了呢
回复 使用道具 举报
本帖最后由 高亮亮 于 2014-1-4 18:29 编辑

Class.forName(startingClassName)-->获取该类的Class对象.
这句没错,字节码文件就是编译结束的***.class那个文件.
Class类的forName();方法API里说的很明白,就是获得该类名对应类的Class对象,这个对象封装了相关联字节码文件的信息.你的理解怎么说呢,应该也算合理.
forName
public static  Class <?> forName(  String  name,boolean initialize,   ClassLoader   loader)          throws ClassNotFoundException
使用给定的类加载器,返回与带有给定字符串名的类或接口相关联的 Class 对象。

回复 使用道具 举报
高亮亮 发表于 2014-1-4 18:25
Class.forName(startingClassName)-->获取该类的Class对象.
这句没错,字节码文件就是编译结束的***.class那 ...

恩恩   明白了  谢谢:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马