反射
是什么?
在程序运行的过程中,通过字节码对象去获取到类中的成员信息(类或者对象真实类型、构造器、方法、字段),这就称为反射
为什么?
当我们在传入对象进行一些操作的时候,大部分需要强转,但是我们不知道调用者带了什么对象的时候无法强转(有风险);
方法已经拿到了对象,却得不到对象的真实类型。
因此我们可以使用反射,可以通过一个对象的字节码文件,获取到它的真实类型以及调用该对象中的方法;(其实本质就是通过对象的字节码文件来对对象进行操作)
特点:
动态性:反射和new都能创建对象并且调用里面的方法,但是反射是针对字符串编程,而new是针对实体类编程,反射可以深入到类的内部结构去进行一些操作;
性能较差;
使用场景:
1.突破一些sdk的API接口限制(访问一个类的私有字段,私有方法等等)
2.生成动态代理
因此反射一般用于一些框架的构建上面,我们平常写项目基本用不到,例如Spring AOP的动态代理实现就是基于反射;
内省
首先我们要先知道什么是JavaBean规范;
JavaBean
JavaBean是java中最重要的一个可重用的组件
JavaBean的规范要求:
1.使用public修饰;
2.提供set/get方法;
3.私有化字段;
4.公共的无参构造器;
三大成员:
1.事件
2.方法
3.属性
如果要获取到JavaBean中的方法,使用反射就非常的麻烦,因此内省也就横空出世了:
内省的作用:
1.获取到属性名和属性类型等相关状态信息;
2.获取属性对应的读写方法,操作属性的值等操作方式;