A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 巴拉巴拉x 初级黑马   /  2018-4-23 14:28  /  663 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小石姐姐 于 2018-4-26 17:20 编辑

反射笔记



反射
  • 为什么要学反射
    • 反射的目的
      • 反射可以在不修改源代码的前提下,改变程序的运行方式
      • 反射是后期web框架的底层实现基础,帮助我们更好理解框架的原理

    • 反射能干的事
      • 前提条件:获取一个类的字节码对象,然后通过该字节码对象可以:
        • 获取一个类的所有的构造方法
          • 创建一个类的对象

        • 获取一个类的所有成员属性
          • 获取属性值
          • 设置属性值

        • 获取一个类的所有成员方法
          • 调用成员呢方法





反射机制: Reflect.
  • 在程序运行时,我们可以获取任意一个类的所有方法和属性
  • 在程序运行时,让我们调用任意一个对象的所有方法和属性
  • 前提:
    • 要获取类的对象(Class对象).三种方式
      • 创建对象,对象调用getClass()方法(C要大写)
      • 类名.class;(c要小写)
      • Class.forName(String 全类名).



通过发射获取构造方法并创建对象
  • 字节码对象的获取构造方法需要的参数也是字节码类型的.
  • Constructor<?>[] getConstructors();获取所有public修饰的构造方法.所以返回值是一个数组,
  • Constructor<?>[] getDeclaredConstructors();
  • 字节码获取的方法中,不加Declared则获取的都是public修饰的,也就是能且只能获取公共的参数
  • 而加了Declared之后就可以获取所有的,只能获取,不能修改(类似于文件的只读属性).想要赋值修改等操作要调用Accessible(ture).

通过反射获取成员变量:设置和获取值
  • 注意:
    • file 文件或文件夹
    • field 字段(成员变量)


字段值是不是就是一个标识?
  • 方法
    • field[] getFields();
    • field getField(String name)
    • field[] getDeclaredFields();
    • field getDeclaredField(String name);


通过反射获取成员方法并调用
  • Method getMethod(String name,Class<?>...parameterTypes);
  • Method中的方法
    • Object invoke(Object,Object...args);


标准类
  • 专业名称:JavaBean.
    • 作用: 封装数据

  • 规范
    • 此类使用public来修饰
    • 成员变量,使用private来修饰,提高安全性
    • 为成员变量提供公共的访问方式,对变量进行限制,符合条件的才会被赋值,安全性
    • 提供公共无参构造.public修饰
    • 实现序列化接口Serializable.
      • 有很大可能会写入文件.



问题
  • 调用静态方法怎么弄?

应用
  • 泛型的擦除
    • 泛型只在编译时期起作用,在字节码对象中是没有泛型的.所以调用字节码对象创建含有带泛型的对象的时候,就会绕过泛型约束,随意添加元素.


BeanUtils : 来自Apache公司,提供许多优质的开源项目.
  • 功能:
    • 是Apache commons提供的一个组件,主要功能就是为了简化JavaBean封装数据的操作
    • 重要方法
      • static void populate(Object bean, Map properties);

    • 注意事项
      • BeanUtils中的get/set有关成员变量的方法,都是通过反射访问程序中的公共get/set方法来实现的,也是为了安全考虑.





0 个回复

您需要登录后才可以回帖 登录 | 加入黑马