------- android培训、java培训、期待与您交流! ----------
1 反射的概念
反射就是把一个java类中的各种成分映射成相应的java类。
例如,一个java类用一个Class类来表示,一个类中的组成部分:成员变量,方法,构造方法,包等信息也用一个个的java类来表示。
2 获取一个类的字节码的三种方式:
例如获取String类的字节码
1 String.class 类名加上”.class“
2 new String().getClass() 实例对象的getClass方法
3 Clasa.forName("java.lang.String")
3 反射的作用
在得到了一个类的字节码实例对象之后,就可以对这个实例对象进行操作,来获取本来类中的一些属性,方法和信息。
1 得到String类的构造方法,只能获取参数为public的构造函数
Class clazz = String.class;
//获得全部的构造函数
Constructor[] constructors = clazz.getConstructors();
//获取参数为StringBuilder的构造函数
Constructor constructor = clazz.getConstructor(StringBuilder.class);//StringBuilder 线程不同步的
在得到String类的构造函数之后就可以进行创建String类的实例对象
//通过反射的方式创建String对象
String s = (String)constructor.newInstance(new StringBuilder());
2 得到String类的方法
//得到全部的方法
Method[] methods = clazz.getMethods();
//获取参数类型为int的charAt方法
Method method = clazz.getMethod("charAt",int.class);
通过反射的方式来,调用方法
method.invoke(new String("abcd"), 1)
3 获得string类的属性
//得到全部的属性
Field[] fields = clazz.getFields();
//得到 CASE_INSENSITIVE_ORDER这个属性
Field field = clazz.getField("CASE_INSENSITIVE_ORDER");
然后就可以获得属性的值了
field.get(String.class)
然后还有一些别的方法,比如getPackage,getName等,还有一些判断的方法,
例如:
clazz.getName();//得到类的名字
clazz.getPackage();//得到类在哪个包下面
clazz.isArray();//判断是不是一个数组
clazz.isEnum();//判断是不是一个枚举类型
clazz.isPrimitive();//判断是不是原始类型,原始类型包括boolean,char,byte,short,int,float,double,long八个
每个类的字节码对象在内存中只有一份,也就是说String.class == new String("") 但是,int.class跟Integer.class是不相等的,因为int是一个原始类型,而Integer是一个包装类。
同样的道理,另外的7个原始类型也一样。在Integer类中有一个TYPE属性,int.class 跟Integer.TYPE是相等的。
当反射作用于数组类型的时候,具有相同的数据类型和形同的维数的数组,在内存中是同一份字节码。
如果方法接受的参数类型是一个数组,那么在用invoke实现这个方法的时候,要将数组再次包装,以为在jdk1.4中没有可变参数这个特性
int[] a = new int[5];
int[] b = new int[10];
int[][] c = new int[5][5];
String[] d = new String[5];
System.out.println(int.class == Integer.class);//false
System.out.println(int.class == Integer.TYPE);//true
Class cls1 = c.getClass();
Class cls2 = d.getClass();
System.out.println(a.getClass() == b.getClass());//true
System.out.println(a.getClass() == cls1);//false
System.out.println(a.getClass() == cls2);//false
java类用两种应用,
工具类:被调用的类,调用工具类来完成一些操作
框架:调用别人的类。在写框架之前不知道别的类的存在,所以在框架中就需要用到反射,来将别人类中的方法或者属性获取出来。
例如:在写框架时,并不知道后面会有哪些类,就像在盖房子时,我们不知道用户要安装什么样的门窗,所以在搭框架时就无法new出门窗的对象
只能用反射来创建和操作。