zoukankan      html  css  js  c++  java
  • java之反射概述

    类加载器和反射 


    类加载器:

    1 类的加载过程:
      当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载、连接、初始化三步骤来实现对这个类进行初始化。
      加载:就是指将class文件读入内存,并为之创建一个Class对象。任何类使用时系统都会建立一个Class对象
      连接:验证,是否有正确的内部结构,并和其他类协调一致。
      准备,负责为类的静态成员分配内存,并设置默认初始化值
      解析,将类的二进制数据中的符号引用替换为直接引用
      初始化:开辟栈、堆内存空间,创建对象、默认初始化、显示初始化、构造初始化


    2 类的加载时机
      1)创建类的实例
      2)访问类的静态变量、或者为类的静态变量赋值
      3)调用类的静态方法
      4)使用反射方法来强制创建某个类或者接口对象的java.lang.Class对象
      5)初始化某个类的子类:初始化子类时,首先加载其父类
      6)直接使用java.exe命令来运行某个主类

    3 类加载器的主要作用:
       负责将.class文件加载到内存,并为之生成对应的Class对象

    4 类加载器的组成
      1)根类加载器:Bootstrap ClassLoader(我们使用的String等类)
        也称为引导类加载器,负责java核心类的加载。比如,System Object String等,在JDK中的JRE的lib目录下rt.jar文件中
      2)扩展类加载器:Extension ClassLoader
        负责JRE的扩展目录中jre包的加载。在JDK中JRE的lib目录下ext目录
      3)系统类加载器:System ClassLoader(加载我们自己写的)
        负责在JVM启动时加载来自java命令的class文件以及classpath环境变量所指的jar包和类路径



    反射:

    1 反射机理
         java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种
          动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
          即:通过class文件对象,去使用该文件中的成员变量、构造方法、成员方法

          要想解剖一个类,必须先要获取到该类的字节码文件对象。
          而解剖使用的就是Class类中的方法。所以先要获取到每一个字节码文件对应的Class对应的Class类型的对象

    2 获取Class对象的方式:必须得到class字节码文件对象,其实就是得到Class类的对象
      假设该People.java打包在 com.hzw.pojo.People 。
      1)通过Object类的getClass()方法
        创建一个对象,通过getClass方法获取Class对象:
        People p = new People();
        Class people = p.getClass();//返回此 Object 的运行时类对象。

      2)通过Class类的静态方法forName(),根据全类名获取Class对象
        Class people = Class.forName("com.hzw.pojo.People");

      3)数据类型(基本和引用)的静态属性class
        Class people = People.class;
        Class c = int.class;      //自动装箱
        Class c1 = String.class;
         注意:一般,开发中使用第二种,因为第二种是一个字符串,而不是一个具体的类名。这样就可以把这样的字符串配置到配置文件中。

    3 Class对象

    Class类:常用类
      成员变量:Field
      构造方法: Constructor
      成员方法:Method
    反射:通过Class类的方法获取以上的三个对应的对象,然后通过Filed/Method/Contructor对象调用其方法去真正的使用类的成员、方法、构造

    4 反射的使用
    1)反射之构造使用:
      主要方法:
        Constructor<T> getContructor(Class<?>... paramTypes)
      参数:parameterTypes - 参数数组 (class类型的参数)
      返回值:一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。

       
        Constructor<?>[] getContructors()
        返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。

        Constructor<T> getDeclaredContructor(Class<?>... paramTypes)
        参数:parameterTypes - 参数数组 
        返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。

        Constructor<?>[] getDeclaredContructors()
        返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。

    实例:
      Class c = Class.forName("com.hzw.pojo.People"); //获取Class文件对象
      Contructor con = c.getContructor();//获取它的指定构造函数对象,此处是默认构造
      Object obj = con.newInstance();//通过该构造函数对象创建一个实例
      System.out.println(obj);//直接打印该对象,即调用该对象实例的toString()方法

    2)反射之成员使用:
    主要方法:
      Field getDeclaredField(String name)
      参数:name - 字段名 
      返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。

      Field[] getDeclaredFields()
      返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。

      Field getField(String name)
      参数:name - 字段名 
      返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

      Field[] getFields()

      返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。


    3)反射之成员方法:

    主要方法:
      Method getMethod(String name, Class<?>... parameterTypes)
      返回一个 Method 对象,返回此 Class 对象所表示的类或接口的公共成员方法。
      参数:name - 方法名   parameterTypes - 参数列表 
      
      Method[] getMethods()
      返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口的公共成员方法。

      Method getDeclaredMethod(String name, Class<?>... parameterTypes)
      参数:name - 方法名     parameterTypes - 参数数组 
      返回:一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法(不分什么修饰符修饰,都可以获取到)

      Method[] getDeclaredMethods()
      返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法

    5 使用时遇到IllegalAccessException异常时,要调用setAccessible( boolean flag)方法,设置取消java语言访问检查。

    public void setAccessible(boolean flag)  throws SecurityException
    将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。 
  • 相关阅读:
    jwplayer播放器停止 单页内多个jwplayer对象停止问题
    jquery.smint.js 页面菜单浮动之谷歌浏览器异常
    jquery获取不到append出来的新元素的解决办法
    Received an invalid response. Origin 'null' is therefore not allowed access
    Java中转UTC时间字符串(含有T Z)为local时间
    OSS 图片处理流程
    java8中的map 和reduce
    MySQL的语句执行顺序
    数据库死锁解决办法
    mysql查询用if控制显示列
  • 原文地址:https://www.cnblogs.com/zwbg/p/5904131.html
Copyright © 2011-2022 走看看