-------------
反射就是把java类中的各种成分映射成相应的java类,即Class类。
获得字节码对应的实例对象的三种方法:
1, 类名.class,例如:System.class;
2, 对象.getClass() 例如:new Date().getClass();
3, Class.forName(“类名”) 例如:Class.forName(“java.util.Date”);
注意:基本数据类型和void有对应的Class;用isPrimitive()判断是否是基本数据类型
int.class == Integer.class
Int.class == Interger.TYPE//true
总之:只要在源程序中出现的类型都有各自的Class实例对象,例如:void,int[].
注:一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象后,得到这些实例对象。怎样用这些实例对象,正是学习和应用反射的重点。
1,Constructor类
1) 得到某个类所有的构造方法:
例子:Constructor [] constructors = Class.forName(“java.lang.String”).getConstructors();
2) 得到某一个构造方法:
3) 创建实例对象:
通常方式:String str = new String (new StringBuffer(“abc”));
反射方式:String str = (String)constructor.newInstance(new StringBuffer(“abc”));//调用获得的方法时要用到上面的相同类型的实例对象
4) Class.newInstance()方法:
例子:String obj = (String)Class.forName(“java.lang.String”).newInstance();
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。
该方法内部的具体代码是怎样写的呢?用到了缓存机制来保存默认构造方法的实例对象。
2, Field类
Field
代码示例:
ReflectPoint pt1 = new ReflectPoint(3,5);//自定类,其中成员变量x=3,y=5,x为私有变量
//用反射获取成员变量
Field fieldy = pt1.getClass().getField(“y”);
System.out.println(fieldy.get(pt1));//打印获取到的y的值
//用反射获取私有变量
Field fieldx = pt1.getClass().getDeclareField(“x”);
Fieldx.setAccessible(true);//设置可以访问
System.out.println(fieldx.get(pt1));//打印获取到的x的值
3, Method类
Method类代表某个类中的一个成员方法
1)
例子:Method charAt = Class.forName(“java.lang.String”).getMethod(“charAt”,int.class);
2)
通常方式:System.out.println(str.charAt(1));
反射方式:System.out.println(charAt.invoke(str,1));
注意:如果传递给Method对象的invoke方法的第一个参数是null,说明这是一个静态方法。
3) jdk1.4和jdk1.5的invoke方法区别:
jdk1.5:public Object invoke(Object obj,Object … args);
jdk1.4: public Object invoke(Object obj,Object[] args);即按jdk1.4的语法,需要将一个数组作为参数传递给invoke方法时,数组中的每个元素分别对应被调用方法中的一个参数,所以,调用charAt方法的代码页可以用jdk1.4改写成:charAt.invoke(str,new Object[]{1});
4, 数组的反射
1, 具有相同维数和元素的类型的数组属于同一类型,即具有相同的Class实例对象
2, 代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
3, 基本类型的一维数组可以被当做object类型使用,不能当做Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。
4, Arrays.asList()方法处理int[]和String[]时的差异;
Int[]的地址会被作为一个元素;String[]数组中的每一个元素都会作为List的元素。