黑马程序员技术交流社区
标题: 求助,关于内省的这个看不懂。 [打印本页]
作者: 张丽 时间: 2012-10-12 09:39
标题: 求助,关于内省的这个看不懂。
{: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"});
作者: 沈佳龙 时间: 2012-10-12 10:48
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
作者: 沈佳龙 时间: 2012-10-12 10:53
忘记说了那个例子的作用就是向ArrayList中添加值。其实这个值不一定是integer 可以是string型的:例如
collection2.getClass().getMethod("add", Object.class).invoke(collection2,''abc'');
这是因为ArrayList虽然有不同的泛型(可是是integer也可以是String)在内存中字节码只有一份,就是编译完成之后就没有类型信息了,已经去类型化了,上面是用反射绕过了编译器对泛型的检测。在泛型的视频中你可以学习到 祝好运···
作者: 张忠豹 时间: 2012-10-12 12:45
写一个程序,这个程序能够根据用户提供的类名,去执行该类中的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);
}
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |