相关概念
反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力,通过反射可以调用私有方法和私有属性,大部分框架也都是运用反射原理的
Java 反射机制是在运行状态中:
- 对于任意一个类,都能够知道这个类的所有属性和方法
- 对于任意一个对象,都能够调用它的任意一个方法和属性 这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
反射 就是把 Java 类中的各种成分映射成一个个的 Java 对象。
Class 对象的由来是将 .class 文件读入内存,并为之创建一个 Class 对象
Class 类的实例 表示 正在运行的 Java 应用程序中的 类和接口。也就是 jvm 中 每个类都有该 Class 对象(包括基本数据类型)
Class 没有公共构造方法。Class 对象 是在 加载类时,由 Java 虚拟机以及通过 调用类加载器 中的 defineClass 方法自动构造的。
在运行期间,一个类只有一个Class对象产生
使用方法
获取Class对象的三种方式
- Object.getClass()
- 任何数据类型(包括基本数据类型)都有一个“静态”的 class 属性
- 通过 Class 类的静态方法:forName(String className)
获取构造方法 并使用
通过 Class 对象可以获取某个类中的构造方法:
1
2
3
4
5
6
7
public Constructor[] getConstructors(); // 得到 所有 "公有的" 构造方法
public Constructor[] getDeclaredConstructors(); // 获取 所有 构造方法(包括私有、受保护、默认、公有)
public Constructor getConstructor(Class... parameterTypes); // 获取 单个的"公有的"构造方法
public Constructor getDeclaredConstructor(Class... parameterTypes); // 获取"某个构造方法"可以是私有的,或受保护、默认、公有;
调用构造方法: 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例
1
Object obj = con.newInstance();
获取成员变量并调用
获取成员变量并调用:
1
2
3
4
Field[] getFields(); // 获取所有的"公有字段"
Field[] getDeclaredFields(); // 获取所有字段,包括:私有、受保护、默认、公有
public Field getField(String fieldName); // 获取某个"公有的"字段
public Field getDeclaredField(String fieldName); // 获取某个字段(可以是私有的)
设置 字段值:
1
Field --> public void set(Object obj, Object value);
参数说明:
- obj: 要设置的字段所在的对象;
- value: 要为字段设置的值;
获取成员方法并调用
获取成员方法并调用:
1
2
3
4
5
6
7
8
9
10
11
public Method[] getMethods(); // 获取所有"公有方法";(包含了父类的方法也包含Object类)
public Method[] getDeclaredMethods(); // 获取所有的成员方法,包括私有的(不包括继承的)
public Method getMethod(String name, Class<?>... parameterTypes):
// 参数:
// name : 方法名;
// Class ... : 形参的Class类型对象
public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
调用方法:
1
Method --> public Object invoke(Object obj, Object... args);
参数说明:
- obj : 要调用方法的对象
- args: 调用方式时所传递的实参