黑马程序员技术交流社区
标题:
【石家庄校区】反射笔记
[打印本页]
作者:
巴拉巴拉x
时间:
2018-4-23 14:28
标题:
【石家庄校区】反射笔记
本帖最后由 小石姐姐 于 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方法来实现的,也是为了安全考虑.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2