1、反射的概念
Java的反射(reflection)机制是指在程序的运行过程中,可以创建任意类的对象, 对于任意一个类,了解类的信息以及属性和方法, 对于任意一个对象,可以调用对象的属性和方法。 这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。 |
好处:
1.增加程序的灵活性,可以在运行的过程中动态对类进行修改和操作
2.可以在运行时轻松获取任意一个类的方法、属性,并且还能通过反射进行动态调用
缺点:
1.使用反射以后,代码的可读性会下降的
2.反射可以绕过一些有限制访问的属性或方法,可能会导致破坏代码本身的抽象性
2、反射机制相关的类
类加载时,JVM自动生成类的Class类对象。 将类的成员进行拆分,拆分成一个个对象。 | |
类 | 描述 |
Class | 代表类对象 |
Field | 代表属性对象 |
Constructor | 代表构造方法对象 |
Method | 代表方法对象 |
- 创建Class类对象三种方式
Class.forName(“全限定名”); //全限定名:包名+类名 (推荐) 类名.class ; 对象名.getClass(); |
列图展示:
示例代码
定义Students类
3、Class类对象常用的方法
1. 反射获取类的包名、类名、修饰符....基本信息的方法
方法名 | 描述 |
getPackage() | 获取包名 |
getName() | 获取全限定名.(包名+类名) |
getSimpleName() | 获取类名 |
getModifiers() | 获取修饰符 |
getSuperclass() | 获取父类 |
getInterfaces() | 获取实现的父接口 |
列图展示:
2. 反射获取构造方法对象 Constructor
方法名 | 描述 |
getConstructor(类<?>... parameterTypes) | 获取指定的公共的构造方法 |
获取所有的公共的构造方法 | |
getDeclaredConstructor(类<?>... parameterTypes) | 获取指定的构造方法 |
获取所有的构造方法 |
构造方法对象常用的方法
方法名 | 描述 |
getModifiers() | 获取修饰符 |
getName() | 获取构造方法名 |
getParameterCount() | 获取参数个数 |
newInstance() | 创建对象 |
例图展示:
3.反射获取属性对象 Field
方法名 | 描述 |
getField(String name) | 获取指定的公共的属性对象 |
getFields() | 获取所有的公共的属性对象 |
getDeclaredField(String name) | 获取指定的属性对象 |
获取所有的属性对象 |
属性对象常用的方法
方法名 | 描述 |
getModifiers() | 获取修饰符 |
getType() | 获取数据类型 |
getName() | 获取属性名 |
set(Object obj ,Object value) | 给指定对象的属性赋值 |
get(Object obj) | 获取指定对象的属性值 |
例图展示:
4. 获取方法对象 Method
方法名 | 描述 |
getMethod(String name, 类<?>... parameterTypes) | 获取指定的公共的方法对象 |
getMethods() | 获取所有的公共的方法对象 |
String name, 类<?>... parameterTypes) | 获取指定的方法对象 |
获取所有的方法对象 |
方法对象常用的方法
方法名 | 描述 |
getModifiers() | 获取修饰符 |
getReturnType() | 获取返回值类型 |
getName() | 获取方法名 |
getParameterCount() | 获取参数个数 |
invoke(Object obj,Object...args) | 调用方法 |
- 私有化成员访问,设置忽略访问修饰符
setAccessible(true); |
例图展示: