------<a href="http://www.itheima.com"target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
反射:
当使用一个类时,内存就会有这个类的字节码,这个字节码就是对象,这个对象就是Class
method代表这个字节码里面的方法
Constructor 代表这个字节码里面的构造方法
简单的说就是任意一个类的字节码 例如Class c=Person.class//字节码
p1代表字节码搞出来的对象
p1.getClass()得到它的字节码
Class.forName()得到这个类的字节码,
第一种是返回一个类字节码已经存在于内存中,直接返回 ,
另一种是虚拟机还没有这个类的字节码,则用类加载器去加载,把加载进来的字节码缓存到虚拟机里面,以后就不用加载了
反射的步骤:
1,通过获得getConstructor() 这个类的构造函数
2,用这个构造函数newInstance()获得这个构造函数创建的对象
例如:Construtor constructor=Class.forName("java.util.String").getConstrutor(StringBuffer.class);
String str=(String)constructor.newInstance(new StringBuffer(”abc");
Class.Instance()代表一个类的无参的构造函数
例如:String str=(String)Class.forName("java.util.String").newInstance();
得到类的字节码有三种方法:
1,用类名.class
2,new 类名().getClass()
3,Class.forName("java.util.Date"); 主要用这种
九个预定义的Class对象:八个基本类型和void 例如:Class c=void.class
反射的小例子:
String str="abc";
Class c1=str.getClass();
Class c2=String.class();
Class c3=Class.forName("java.util.String");
注:他们返回的字节码都是同一个。
isPrimitive()判断是否为基本类型
Integer.TYPE 代表得是把Integer转换为了基本类型
任何类型都有字节码。
数组类型的Class实例对象: Class.isArray()
总之 只要是在源程序中出现的类型,都有各自Class实例对象,例如int[] , void 等
* 反射就是把Java类中的各种成分映射成相应的Java类
* Constructor 的对象是通过 getConstructors()来获取,返回的是Constructor类型的数组
得到一个类中的所有构造方法“
Constructor[] constructos=Class.forName("java.util.String").getConstructors();
得到一个类中的某一个构造方法:
Construtor constructor=Class.forName("java.util.String").getConstrutor(StringBuffer.class);
** 而newInstance是Class的一个方法,在这个过程中,是先取了这个类的不带参数的构造方法,然后调用构造方法的newInstance来创建对象
RefiectPoint rp=new RefiectPoint(3,5); RefiectPoint为一个类的构造函数
Field fieldY=rp.getClass().getField("y"); y代表RefiectPoint类的一个成员变量
fieldY.get(rp); //获取在rp对象中的y的值
Field 一个类的字段(变量)
**获取一个类中的私有的变量
Field fieldX=rp.getClass().getDeclareField("x"); //
fieldX.setAccessible(true);
fieldX.get(rp);
数组反射:
如果都是一维数组或者同时二维数组,并且类型相同,那么他们的字节码是相同的
a1.getClass().getSuperclass().getName()获取一个类的父类的名字
把字符串数组转换成List对象,用Arrays.asList(str1);
hashCode内存泄漏,