黑马程序员技术交流社区

标题: 关于反射Method [打印本页]

作者: 王宝龙    时间: 2012-10-5 13:13
标题: 关于反射Method
本帖最后由 王宝龙 于 2012-10-5 16:12 编辑

第18行:String startingClassName = args[0];这一行代码没有搞懂是干什么的?
而且这个程序 在我Eclipse上运行会报ArrayIndexOutOfBoundsException
不知道哪里的问题?


  1. import java.lang.reflect.Constructor;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;

  4. public class ReflectTest
  5. {
  6.         public static void main(String[] args) throws Exception
  7.         {
  8.                 Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
  9.                 String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));
  10.                 System.out.println(str2.charAt(2));
  11.                
  12.                 Method methodCharAt = String.class.getMethod("charAt", int.class);
  13.                 System.out.println(methodCharAt.invoke(str2,1));
  14.                
  15.                 String startingClassName = args[0];//这里的args[0]不明白是干什么的
  16.                 Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class);
  17.                 mainMethod.invoke(null,(Object)new String[] {"111","222","333"});
  18.                         
  19.                 mainMethod.invoke(null,new Object[]{new String[] {"111","222","333"}});
  20.         }
  21. }
  22. class TestArguments
  23. {
  24.         public static void main(String[] args)
  25.         {
  26.                 for(String arg : args)
  27.                 {
  28.                         System.out.println(arg);
  29.                 }
  30.         }
  31. }
复制代码

作者: 陈俊来    时间: 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