黑马程序员——反射

------<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内存泄漏,

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值