A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张丽 中级黑马   /  2012-10-12 09:39  /  1525 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

{:soso_e109:}mainMethod.invoke是什么意思啊???invoke又是什么意思???真的没看懂啊。
String startingClassName = args[0];
  Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class);
  //mainMethod.invoke(null, new Object[]{new String[]{"111","222","333"}});
  mainMethod.invoke(null, (Object)new String[]{"111","222","333"});

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
invoke是Method类的一个方法是:
对带有指定参数的指定对象调用由此 Method 对象表示的基础方法
Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class);这句话是获取startingClassName这个类的main函数,
public Object invoke(Object obj,  Object... args)
obj - 从中调用基础方法的对象
args - 用于方法调用的参数
mainMethod.invoke(null, (Object)new String[]{"111","222","333"});由于是main方法是静态的。
invoke有一条规则是如果基础方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null

给你举一个例子,你看张孝祥老师的视频后面会有:
ArrayList<Integer> collection2 = new ArrayList();
collection2.getClass().getMethod("add", Object.class).invoke(collection2, 1);
先获取collection2这个字节码,调用getMethod,使用add方法,然后用invoke方法给collection2这个实体传一个integer的数值1
回复 使用道具 举报
忘记说了那个例子的作用就是向ArrayList中添加值。其实这个值不一定是integer  可以是string型的:例如
collection2.getClass().getMethod("add", Object.class).invoke(collection2,''abc'');
这是因为ArrayList虽然有不同的泛型(可是是integer也可以是String)在内存中字节码只有一份,就是编译完成之后就没有类型信息了,已经去类型化了,上面是用反射绕过了编译器对泛型的检测。在泛型的视频中你可以学习到  祝好运···
回复 使用道具 举报
写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法?
示例代码:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class RefectTest {
         public static void main(String args[]) throws Exception {
                   /**Method类*/
                   Method charAt = str.getClass().getMethod("charAt", int.class);
                   System.out.println(charAt.invoke(str, 1));
                   System.out.println(charAt.invoke(str, new Object[]{2}));//用jdk1.4的方式进行调用,Object数组长度为1
                   //invoke:对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
                   //如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。 因为静态方法时不需要对象的!
                   System.out.println(str.getClass().getMethod("valueOf", float.class).invoke(null, 12.3f));
                   /**Method的高级应用:
                    写一个程序,这个程序能够根据用户提供的类名,去执行该类中的main方法?*/
                   //常用方式:TestArguments.main(new String[]{"abc","def","ghi"});
                   String startingMainClass = args[0];
                   //参数为将要运行的java类名,main方法的参数为字符串数组
                   Method mainMethod = Class.forName(startingMainClass).getMethod("main", String[].class);
                   //invoke为方法的调用,main方法为static方法,所以第一个参数为null
                   //第一种:将字符串转换成Object对象。注意每一个的数组父类都是Object。
                   //就相当于跟编译器说:我是一个Object对象不是一个数组,不要给我拆包了!
                   mainMethod.invoke(null, (Object)new String[]{"abc","def","ghi"});
                   //第二种:将字符串数组作为Object数组中的一个元素
                   mainMethod.invoke(null, new Object[]{new String[]{"abc","def","ghi"}});
         }
}
class TestArguments{
         public static void main(String args[]){
                   for(String arg :args){
                            System.out.println(arg);
                   }
         }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马