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

  • 相关阅读:
    [转]vim 退格键(backspace)不能用
    centos出现“FirewallD is not running”怎么办
    cordova 实现拨打电话-只需两步(H5)
    腾讯云上运行java程序过程
    centos7 安装php
    centos 7 PostgreSQL一些简单问题以及解决办法
    centos 安装 java
    git push报错error: failed to push some refs to 'git@github.com:
    linux install beanstalkd
    centos7 执行一个数据库脚本创建项目中的数据库
  • 原文地址:https://www.cnblogs.com/wdsthink/p/4374512.html
Copyright © 2011-2022 走看看