反射 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框架底层都是反射实现的

 

 

 

 

    

posted @ 2019-08-29 11:03  我爱si搬砖  阅读(179)  评论(0编辑  收藏  举报