zoukankan      html  css  js  c++  java
  • 黑马程序员——反射


    反射就是把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集合中删除当前对象,
       从而造成内存泄露(内存泄露指的是当对象已经没有作用时却不能删除,而导致一直占用内存的状况)。

  • 相关阅读:
    使用MyBatis生成插件
    关联源码及日志
    下载依赖
    框架简介及基本使用
    注解的本质 及 反射读取属性值
    元注解
    广告系统学习笔记(一)
    Nginx学习笔记(三)
    Nginx学习笔记(二)
    Nginx学习笔记(一)
  • 原文地址:https://www.cnblogs.com/wdsthink/p/4374512.html
Copyright © 2011-2022 走看看