Java基础 系列 反射

Posted by lichao modified on March 1, 2020

相关概念

反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力,通过反射可以调用私有方法和私有属性,大部分框架也都是运用反射原理的

Java 反射机制是在运行状态中:

  • 对于任意一个类,都能够知道这个类的所有属性和方法
  • 对于任意一个对象,都能够调用它的任意一个方法和属性 这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。

反射 就是把 Java 类中的各种成分映射成一个个的 Java 对象。

Class 对象的由来是将 .class 文件读入内存,并为之创建一个 Class 对象

Class 类的实例 表示 正在运行的 Java 应用程序中的 类和接口。也就是 jvm 中 每个类都有该 Class 对象(包括基本数据类型)

Class 没有公共构造方法。Class 对象 是在 加载类时,由 Java 虚拟机以及通过 调用类加载器 中的 defineClass 方法自动构造的。

在运行期间,一个类只有一个Class对象产生

使用方法

获取Class对象的三种方式

  1. Object.getClass()
  2. 任何数据类型(包括基本数据类型)都有一个“静态”的 class 属性
  3. 通过 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: 调用方式时所传递的实参