本帖最后由 小石姐姐 于 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方法来实现的,也是为了安全考虑.
|
|