反射

发布时间 2024-01-06 14:46:13作者: 梅丹隆

允许程序在运行时类进行自我检查并切对内部的成员进行操作

1、概念

主要指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关语义

2、作用

  • 在运行时判断任意一个对象所属的类
  • 在运行时获取类的对象
  • 在运行时访问java对象的属性、方法、构造方法等

3、类库

java.lang.reflect类库中主要的类

  • Field:表示类中的成员变量
  • Method:表示类中的方法
  • Constructor:表示类的构造方法
  • Array:该类提供了动态创建数组和防伪数组元素的静态方法

4、Class

用来表示运行时类型信息的对应类

  • 灭个类都有唯一一个与之相对应的Class对象
  • Class类为类类型,而Class对象为类类型对象

4.1、特点

  1. Class类也是类的一种,class则是关键字
  2. Class类只有一个私有的构造函数,只有JVM能够创建Class类的实例
  3. JVM中只有唯一一个和类相对应的Class对象来描述其类型信息

4.2、获取Class对象的三种方式

在运行期间,一个类,只有一个与之相对应的Class对象产生

  1. Object --> getClass()
  2. 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
  3. 通过Class类的静态方法:forName(String className)(常用)

5、常见用法

image.png

5.1、获取类的构造方法

/*
 * 通过Class对象可以获取某个类中的:构造方法;
 *
 * 获取构造方法:
 *         1).批量的方法:
 *             public Constructor[] getConstructors():所有"公有的"构造方法
               public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)
 *         2).获取单个的方法,并调用:
 *             public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:
 *             public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;
 *
 *             调用构造方法:
 *             Constructor-->newInstance(Object... initargs)
 */

:::warning
注意:
未加“Declared”字段,只能访问“公有”字段/方法
:::

5.2、获取类的成员变量

/*
 * 获取成员变量并调用:
 *
 * 1.批量的
 *      1).Field[] getFields():获取所有的"公有字段"
 *      2).Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;
 * 2.获取单个的:
 *      1).public Field getField(String fieldName):获取某个"公有的"字段;
 *      2).public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)
 *
 *   设置字段的值:
 *      Field --> public void set(Object obj,Object value):
 *                  参数说明:
 *                  1.obj:要设置的字段所在的对象;
 *                  2.value:要为字段设置的值;
 */

5.3、获取类的成员方法

/*
 * 获取成员方法并调用:
 *
 * 1.批量的:
 *      public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)
 *      public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)
 * 2.获取单个的:
 *      public Method getMethod(String name,Class<?>... parameterTypes):
 *                  参数:
 *                      name : 方法名;
 *                      Class ... : 形参的Class类型对象
 *      public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
 *
 *   调用方法:
 *      Method --> public Object invoke(Object obj,Object... args):
 *                  参数说明:
 *                  obj : 要调用方法的对象;
 *                  args:调用方式时所传递的实参;
 */

参考
Spring源码轻松学 一课覆盖Spring核心知识点