黑马程序员技术交流社区
标题:
关于反射Method
[打印本页]
作者:
王宝龙
时间:
2012-10-5 13:13
标题:
关于反射Method
本帖最后由 王宝龙 于 2012-10-5 16:12 编辑
第18行:String startingClassName = args[0];这一行代码没有搞懂是干什么的?
而且这个程序 在我Eclipse上运行会报ArrayIndexOutOfBoundsException
不知道哪里的问题?
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectTest
{
public static void main(String[] args) throws Exception
{
Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));
System.out.println(str2.charAt(2));
Method methodCharAt = String.class.getMethod("charAt", int.class);
System.out.println(methodCharAt.invoke(str2,1));
String startingClassName = args[0];//这里的args[0]不明白是干什么的
Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class);
mainMethod.invoke(null,(Object)new String[] {"111","222","333"});
mainMethod.invoke(null,new Object[]{new String[] {"111","222","333"}});
}
}
class TestArguments
{
public static void main(String[] args)
{
for(String arg : args)
{
System.out.println(arg);
}
}
}
复制代码
作者:
陈俊来
时间:
2012-10-5 13:55
这个我也没用搞太明白,同求答案
作者:
覃宏海
时间:
2012-10-5 13:56
本帖最后由 覃宏海 于 2012-10-5 13:58 编辑
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectTest
{
public static void main(
String[] args
) throws Exception
{
Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));
System.out.println(str2.charAt(2));
Method methodCharAt = String.class.getMethod("charAt", int.class);
System.out.println(methodCharAt.invoke(str2,1));
String startingClassName =
args[0];//
这里的args[0]不明白是干什么的----------------------->
主函数main要传入的是一个String的数组,这是取这个数组的第一个元素,它的角标位置是0,简单来讲就是主函数的参数类型是String[] 数组,这里是获取这个数组的第1个元素。
Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class);
mainMethod.invoke(null,(Object)new String[] {"111","222","333"});
mainMethod.invoke(null,new Object[]{new String[] {"111","222","333"}});
}
}
class TestArguments
{
public static void main(String[] args)
{
for(String arg : args)
{
System.out.println(arg);
}
}
}
作者:
王贵朝
时间:
2012-10-5 14:07
第18行:String startingClassName = args[0];这一行代码没有搞懂是干什么的?
在cmd中运行 java 加类名 再加上参数而这个参数就是String【】 args
作者:
谭立文
时间:
2012-10-5 14:28
如果你在运行这段代码时没有在命令行给主函数传入参数,主函数中的args数组的长度是为0的
,如果你这时候引用该数组,则会报告数组下表越界的异常。
你可以在运行时传入一个参数,其实这个例子的意思就是动态的来调用另一段代码的主函数。
在Eclipse下有一个,run configuratios在里面的arguments里面写入你的包名 加 TestArguments
例如我的包名是package com.wenfengkeji.heima;
则传入
com.wenfengkeji.heima.TestArguments
作者:
孙含庆
时间:
2012-10-5 14:31
本帖最后由 孙含庆 于 2012-10-5 14:33 编辑
public class ReflectTest
{
public static void main(String[] args) throws Exception
{
Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));
System.out.println(str2.charAt(2));
Method methodCharAt = String.class.getMethod("charAt", int.class);
System.out.println(methodCharAt.invoke(str2,1));
String startingClassName = args[0];
//这里意思是访问main 方法中得String[] 类型数组 args 的0角标元素
*
//看你代码的意思是要用反射方式向main 主方法的 String[] 数组里传入元素,可是上面这句是直接访问这个 arg[0],
//不是用反射而是直接访问,那么arg[0]这个元素根本不存在,当然会报角标越界异常了。
Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class);
mainMethod.invoke(null,(Object)new String[] {"111","222","333"});
mainMethod.invoke(null,new Object[]{new String[] {"111","222","333"}});
}
}
作者:
王宝龙
时间:
2012-10-5 14:34
本帖最后由 王宝龙 于 2012-10-5 14:36 编辑
谭立文 发表于 2012-10-5 14:28
如果你在运行这段代码时没有在命令行给主函数传入参数,主函数中的args数组的长度是为0的,如果你这时候引 ...
明白了 谢谢!!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2