一、理解反射 通俗的说,反射就是把java类中的各个成分映射成相应的java类。 Constructor:代表构造函数的类 Field:代表成员变量的类 Method:代表成员方法的类 二、反射的作用 1.框架和框架要解决的核心问题 售楼处卖房子给用户,用户自己装修和安装空调等家具,房子就是一个框架,用户在使用框架,所安装的 东西都是装进售楼出提供的房子这个框架中。 注意:框架和工具类的区别。框架是指用来调用使用者提供的类。而工具类则是被使用者的类调用。 2.框架所要解决的核心问题 我在写框架是,使用者的类可能还不存在。那如何去调用使用者将来所写的类?应为在写程序时无法预知 将来要被调用的类,也就无法new某个类的实例对象。所以要用反射的方式来做。 三、反射的基石--Class类 java程序中的各个java类都属于同一事物,描述这类事物的java类就是Class类。 四、得到各个字节码对应的实例对象(Class类型) 1. 类名.class 如System.class 2. 对象.getClass() 如new Date().getClass() 3. Class forName("类名") 如Class.forName("java.util.Date") 五、九个预定义的Class实例对象 八个基本类型和 void,这些类对象由 Java 虚拟机创建,与其表示的基本类型同名 例:int.class = Integer.TYPE void.class =Void.TYPE 注: Class类提供了一个方法 isPrimitive()可以用来判断是否为表示为基本类型。 六、Constructor类 1.得到某个类的所有构造方法:通过Class类的 getConstructors()获得。返回一个包含Constructor对象的 数组 例:Constructor[] cotrs = String.class.getConstructors(); 2.得到某一个构造方法:通过Class类的getConstructor(参数)获得。 例:Constructor cotr = String.class.getConstructor(StringBuffer.class); 3.创建实例对象: 通常:String str=new String(new StringBuffer("abc")); 反射:Constructor cotr = String.class.getConstructor(StringBuffer.class); String str = (String)cotr.getInstance(new StringBuffer("abc")); 4.Class.newInstance()与Constructor.getInstance(参数);区别 Class.newInstance()是通过内部先得到默认的构造方法创建实例对象。效率高。 七、Filed类:代表某个类的成员变量。 获取成员变量 Class.getFiled(String name)与geteclaredField(String name)区别。 注: 第一个是获取可见的成员变量(public)、第二个可以获取私有的成员变量,与setAccessible(ture)一起 使用,称为暴力反射。 八、Method类:代表某个类的一个成员方法 1.得到类中的某一个方法: 例: Method charAt= String.class.getMethod("charAt",int.Class); 2.调用方法: 通常:str.charAt(1); 反射:Method charAt= String.class.getMethod("charAt",int.Class); charAt.invoke(new String("abc"),1); 注:如果invoke()方法的第一个参数为null,则所调用的为静态方法。 九、数组的反射 1.具有相同维数和元素类型的数组属于同一个类型, 2.代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class. 3.基本类型的一维数组可以被当作Object类型使用。不能当作Object[]类型使用。非基本类型的一维数组,既可 以当作Object类型使用,又可作为Object[]类型使用。 例:int [] a1 = new int[3]; int [] a2 = new int[5]; int[][]a3= new int [2][3]; String[] a4 = new String[3]; a1.getclass() == a2.getclass(); ture a1.getClass()==a3.getclass(); false a1.getclass()==a4.getclass(); false
|