2020-08-22

反射(框架设计的灵魂)

框架

  • 半成品软件。可以在框架的基础上进行软件开发,简化编码

概念

  • 将类的各个组成部分封装成其他对象,这就是反射概念
  • Java代码在计算机中经历的三个阶段:
    • Source源代码阶段:
      • javac编译为.class文件
      • 使用(ClassLoader)类加载器将其加载到内存中
    • class类对象阶段
      • class.forname(“全类名”):
        • 将字节码文件加载进内存,返回class对象
        • 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
      • 类名.class:
        • 通过类名或者属性class获取
        • 多用于参数的传递
      • 对象.getClass():
        • getClass()方法在object类中定义着
        • 多用于对象的获取字节码文件方式
    • Runtime它运行阶段
  • 结论:
    • 同一个字节码文件(*。class)在一次程序运行过程中,指挥被架子啊一次,不论通过哪一种方法获取的class对象都是同一个

class对象功能:

  • 获取功能

    • 获取成员变量们

      • Field[] getFields()

      • Field getField(String name)

      • Field[] getDeclaredFields()

        • 获取所有成员变量,不考虑修饰符

        • 忽略访问权限修饰符的安全检查

          • (暴力反射)

            • X.setAccessible(true);
              
      • Field getDeclaredField(String name)

    • 获取构造方法们

      • Construtor<?>[] getConstrutors()

      • Construtor getConstrutor(类<?>…parameterTypes)

      • Construtor getDeclaredFieldtConstrutors(类<?>…parameterTypes)

        • 创建对象

          • X.newInstance("xxx","xxx");
            
        • 如果使用空参数构造方法创建对象,操作可以简化

          • class对象的newInstance()来使用
      • Construtor<?>[] DeclaredFieldtConstrutors()

    • 获取成员方法们

      • Method[] getMethods()

        • 获取指定名称的方法

          • 先创建对象

          • 执行方法

            • invoke(x,x,x);
              
      • Method getMethod(String name,类<?>…parameterTypes)

      • Method[] getDeclaredMethods()

      • Method getDeclaredMethod(String name,类<?>…parameterTypes)

    • 获取类名

      • String getName()
        • 打印出所有方法名
        • 打印出包名

好处

  • 在程序运行中,操作这些对象
  • 可以解耦,提高程序的扩展性

写框架的步骤

  • 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
  • 在程序中加载读取配置文件
  • 使用反射技术来加载类文件进内存
  • 创建内存
  • 执行发法

框架

  • 加载配置文件

    • 创建对象

    • 加载配置文件,转化为一个集合

      • Properties pro = new Properties();
        
      • 获取class目录下的配置文件

        • ClassLoader classLoder = ReflectTest.class.getClassLoadder();
          InputStream is = classLpader.getResourceAsStream("pro.properties");
          pro.load(is);
          
  • 获取配置文件中定义的数据

    • String className = pro.getProperty("className");
      String methodName = pro.getProperty("methodName");
      
  • 加载该类进内存

    • class cla = Class.forName(className);
      
  • 创建对象

    • Object obj = cls.newInstance();
      
  • 获取方法对象

    • Method method = cls.getMethod(methodName);
      
  • 执行方法

    • method.invoke(obj);
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值