• 反射 Reflect


    1. 解释:

      (1) 给一个类,照透视,可以获得一个类的定义信息:

      包名、类名
    
      成员变量的定义信息
        getFields();  获得所有可见(私有的不能获得)的成员变量,包括继承的变量
        getDeclaredFields()  本类定义的所有成员变量,包括私有变量,不包括继承变量
        getField(变量名)    获得一个变量
        getDeclaredField(变量名)  获得一个变量
      构造方法的定义信息
        getConstructors();  所有可见的构造方法
        getDeclaredConstructors()  所有的构造方法,包括私有的
        getConstructor(参数类型列表)  获得一个构造方法
        getDeclaredConstructor(参数类型列表)  获得一个构造方法
      方法的定义信息
        getMethods()  获得可见的方法。包括继承的方法
        getDeclaredMethods()  获得本类定义的所有的方法,包括私有的,不包括继承的
        getMethod(方法名,参数列表)  获得一个方法
        getDeclaredMethod(方法名,参数列表)  获得一个方法
    练习参考下篇随笔:https://www.cnblogs.com/gxlaqj/p/11429177.html

      (2)反射新建实例(创建对象)

        执行无参构造  //c 为类对象  
    
          Object obj = c.new Instance();
    
        执行有参构造
    
          //获得构造方法
    
           Constructor cc = c.getConstructor(int.class,String.class);
    
          //新建实例,并执行这个有参构造
    
          Object obj = cc.newInstance(5,"abc");
    
    练习参考下篇随笔:https://www.cnblogs.com/gxlaqj/p/11429177.html

      (3).反射调用成员变量

         获取成员变量
          Field f = c.getDeclaredField(变量名);
        使私有变量也能访问
          f.setAccessible(true);
        给变量赋值
          f.set(实例,值);
            若是静态方法。第一个参数给null
        取值
          f.get(实例);
            j静态方法,第一个参数给null;

      (4).反射调用成员方法

      获取方法
        Method m = c.getMethod(方法名,参数类型列表);
      使私有方法可以被调用
        m.setAccessible(true);
      调用方法:
        m.invoke(实例,具体参数数据);
        如果静态方法,第一个参数给null
        如果是void方法,返回值是null

    2. 反射需要使用 类对象 

      类对象:一个类被加载到方法去,会创建一个“类对象”,类型是Class类型

      获取类对象:

        (1)类名.class

          String.calss

          Integer.class

          Soldier.class

        (2)Class.forName(“完整类名”)

        (3)对象.getClass();

    3. 获得包名类名

      //c 为类对象

      c.getPackget().getName();  获得字符串包名

      c.getName()  完整类名(包含包名)

      c.getSimpleName()  获得简写类名(不包含包名)

    4.  反射用来做动态编程

      一些程序中,有固定的执行流程

      程序执行流程中的组件,可以通过配置文件来配置

      SSM框架底层都是反射实现的

        

  • 相关阅读:
    OC内存管理
    摘要算法
    加密算法
    编码技术
    Golang遇到的一些问题总结
    SignalR
    uni-app 小程序 vue
    C# 调用 C++ dll的两种方式
    Vue 项目 VSCode 调试
    Navicat 导出 表结构
  • 原文地址:https://www.cnblogs.com/gxlaqj/p/11428526.html
Copyright © 2020-2023  润新知