String[] args 这是运行时你给主函数传入的参数,主函数会根据你传入的这个参数反射获取相应的类信息
import java.lang.reflect.Method;
public class aa{
public static void main(String[] args) throws Exception{
String startClassName=args[0];//不明白为什么要将数组的第一个元素假设成要加载的类的名字,为什么要这样假设?是怎么想到用这样的假设呢?
因为这是用到了反射,你不知道你要反射的是那个类,所以以参数的形式传入,只需在运行时传入这个参数--既类名,那么就可以获取这个类中的所以信息,然后操作
其二:类名可以通过读取配置文件获取,你程序N年前就已经写好了,那么你现在想用这个程序就只需写一个N年后的类, 把配置文件中的类名改成你写的类名,那么程序就会运行你写的这个类
这样就不必去改源代码,-----------这是反射的重点哦哦哦
Method method=Class.forName(startClassName).getMethod("main", String[].class);
method.invoke(null, (Object)new String[]{"aa","bb","cc"});//这里我试过只有强转的方式才可以,new Object()的方式报告编译错误,又是什么原因造成?
---报错的原因应该是:人家接受的是数组,而你直接传入的是new Object对象进去当然会错了额
这个张老师的视频里面有提到:第二个参数有两种形式写法
第一就是你写的那种
第二就是:因为jdk的新特性,会对String[]进行拆包,你可以在拆包前在给他加一层包,当拆完包后就可以用String[]了
}
}
class TestMain {
public static void main(String[] args) {
for(String arg:args){
System.out.println(arg);
}
}
} |