本帖最后由 高亮亮 于 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"}});
调用Method的invoke(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"}.
好了,这个时候,参数传递正确,就完成了句代码.
|