黑马程序员——反射

时间:2023-02-19 16:50:30


反射就是把java类中的各个成分映射成相应的类
1.Class类:java程序中的给个类属于同一类事物,可以用一个类来描述这类事物,这个类的名字就是Class
每一个Class对象表示内存中的一个字节码
Class类没有构造函数
2.如何得到字节码实例对象
类名.class
对象.getClass()
Class.forName("类名"):返回字节码,如果已经被加载则直接返回,如果不存在则使用类加载器加载,把加载进的字节码缓存到虚拟机

九个预定义的的Class实例对象:8个基本数据类型和void

3.Constructor类
得到某一个类的所有构造方法:getConstructor()
得到某一个构造方法:getConstructor(参数类型)
创建实例对象,例子:String str=(String)constructor.newInstance(参数)

*Class对象也有一个newInstance()方法:创建Class对象所表示的类的实例(调用空参数列表的构造函数)

4.Field类:代表字节码的一个变量,不代表某个对象的变量
Class对象的getField(String name)方法只能获取类的可见成员变量
getDeclaredField(String name):获取所有的成员变量,但是此时只是知道类中有着个成员,
依然不可使用,若想使用私有成员,需要调用setAccessible(true)方法,也就是暴力反射

5.Method类
得到类中的某一个方法:
Method chatAt=Class.forName("java.lang.String").getMethod("charAt",int.class)//两个参数分别是方法名和参数
调用方式:如果第一个参数为null,以为这该method对象是一个静态方法
charAt.invoke(str,1) 等同于str.charAt(1)
6.数组的反射:

   具有相同维数和元素类型的数组属于同一个类型,即
   具有相同的Class实例对象
   基本数据类型的数组可以被当做Object类型,不能被当做Object[]类型;
   非基本类型的以为数组既可以当做Object类型使用,又可以当做Object[]类型使用
   Arrays.asList[]方法处理int[]和String[]时候的差异
    Array工具类用于完成对数组的反射操作
7.通常来说,一个类的两个*对象用equals()方法比较的结果 相等时,他们的哈希码也相等,反之不成立
   当一个对象被存储进HashSet以后,就不能修改这个对象哪些参与计算hashCode的字段了,否则对象修改后的哈希值与最初存储进
  HashSet集合时的哈希值就不痛了,在这种情况系,即使在contains()方法使用该对象的当前引用
  作为参数去HashSet检索对象,也将返回找不到对象的结果。这也会导致无法从HashSet集合中删除当前对象,
   从而造成内存泄露(内存泄露指的是当对象已经没有作用时却不能删除,而导致一直占用内存的状况)。