1 Constructor类
一个Method代表一份字节码里面的一个方法
一个Constructor代表字节码里面的一个构造方法
得到某个类所有的构造方法:
Constructor[] constructor =Class.forName("java.lang.String").getConstructors();得到某一个构造方法:
Constructor constructor =Class.forName("java.lang.String").getConstructor(StringBuffer class);
创建实例对象:
通常方式:Stringstr = new String(StringBuffer("abc"));
反射方式:Stringstr =(String)constructor.newInstance(new StringBuffer("abc"));
//调用获得的方法时要用到上面相同类型的实例对象Class.newInstance()方法:
例子:Stringobj = (String)Class.forName("java.lang.String").newInstance();
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。用到了缓存机制来保存默认构造方法的实例对象;找不带参数的构造方法,可以省事;
2、Filed类
代表某个类中的一个成员变量;
3、 Method类
代表某个类中的一个成员方法得到类中的某个方法:
4、用反射方式执行某个类中main方法时,因为jdk1.4的语法是将传入的字符串数组解包成数组元素个数的参数,所以不能Class.forName("类名").getMethod("main",String[]).invoke(null,newString[]{"xxx"});这样做会出现参数类型不对的问题。
解决办法:将传入的数组装进数组里,即:methodMain.nivoke(null,newObject[]{new String[]{"xxx"}});或者直接将数组转成Object:methodMain.nivoke(null,(Object){newString[]{"xxx"});这样,编译器就编译时就不把参数当数组看待了,就免去了拆数组的错误了。
5、数组的反射
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象;
基本类型的一维数组可以被当做Object类型使用,不能当做Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用; Array工具类用于完成对数组的反射操作;
|
|