黑马程序员技术交流社区

标题: 对接收数组参数的成员方法进行反射的问题 [打印本页]

作者: 杨丽静    时间: 2014-1-4 16:18
标题: 对接收数组参数的成员方法进行反射的问题
反射这块好难啊,哪位同学给讲解下这三句代码,
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里面加路径是怎莫回事


作者: 高亮亮    时间: 2014-1-4 17:53
本帖最后由 高亮亮 于 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"}.
好了,这个时候,参数传递正确,就完成了句代码.


作者: 杨丽静    时间: 2014-1-4 18:20
高亮亮 发表于 2014-1-4 17:53
我进度还没有赶到张孝祥老师的反射那块,只自己学了下Class类.但后面run那个问题你问的我没太弄明白需求.就 ...

Class.forName(startingClassName)-->获取该类的Class对象的字节码吧
你分析的很透彻后面的两句我也都理解了,就是第一句代码跟后面的联系不起来。本来Class.forName("类名")是获取字节码的一种方式但是String startingClassName = args[0];怎么就成了类名了呢
作者: 高亮亮    时间: 2014-1-4 18:25
本帖最后由 高亮亮 于 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 19:49
高亮亮 发表于 2014-1-4 18:25
Class.forName(startingClassName)-->获取该类的Class对象.
这句没错,字节码文件就是编译结束的***.class那 ...

恩恩   明白了  谢谢:handshake




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