java反射相关类
class类
正在运行在内存中的所有类都是该类的实例对象,每个class类都包含本类的所有信息
类内部的主要信息
- Field;所有属性
- Method:所有方法
- Constructor:所有构造方法
Field类
通过反射的class类可以得到一个Field对象时,其中包含了某一个类其中一个属性的所有信息
类内部主要信息
- 标注在属性上的注解
- 属性名
- 属性的数据类型
- 属性的访问修饰符
Constructor类
描述Class类中的构造方法的一个类
类内部的主要信息
method类
描述clsass类中所有方法(不包括构造方法的类),包括抽象方法
类内部的主要信息
- Constructor类内部主要信息相同
- 方法的返回类型
Class类内部主要信息
Field类(变量)
Constructor类(构造器)
Declared修饰相关说明
- 有Declared修饰的方法:可以获取该类内部包含的所有变量、方法和构造器,但是无法获取继承下来的信息
- 无Declared修饰的方法:可以获取该类中public修饰的变量、方法和构造器,可获取继承下来的信息
Method类(普通方法)
-
包括共有的和私有的修饰方法,且可以继承下来的方法 -
无法获取父类被protect修饰符修饰的方法 -
Method类常用方法
- Method[] getMethods():获取类中被public修饰的所有方法
- Method getMethod(String name, Class…<?> paramTypes):根据名字和参数类型获取对应方法,该方法必须被public修饰
- Method[] getDeclaredMethods():获取所有方法,但无法获取继承下来的方法
- Method getDeclaredMethod(String name, Class…<?> paramTypes):根据名字和参数类型获取对应方法,无法获取继承下来的方法
注解(Annotation)
反射的应用场景(常见的)
Spring 实例化对象:当程序启动时,Spring 会读取配置文件applicationContext.xml并解析出里面所有的 标签实例化到IOC容器中。
反射 + 工厂模式:通过反射消除工厂中的多个分支,如果需要生产新的类,无需关注工厂类,工厂类可以应对各种新增的类,反射可以使得程序更加健壮。
JDBC连接数据库:使用JDBC连接数据库时,指定连接数据库的驱动类时用到反射加载驱动类
比较一个对象前后数据的异同可以使用反射
反射的优势及缺陷
优点
- 增加程序的灵活性:面对需求变更时,可以灵活地实例化不同对象
缺陷
- 破坏类的封装性:可以强制访问 private 修饰的信息
- 反射相比直接实例化对象、调用方法、访问变量,中间需要非常多的检查步骤和解析步骤,JVM无法对它们优化。(使用反射会产生比较多的临时对象,导致GC频繁)
|