Java反射详解及作用

article/2025/10/10 0:36:26

参考视频链接: 哔哩哔哩视频.

1. 反射概述

能够分析类能力的程序叫做反射(reflective),对于任何一个Class类,反射可以在运行时直接得到这个类的全部成分,包括构造器,成员方法,成员变量。获得的构造器对象为Constructor,成员方法对象为Method,成员变量对象为Field。这种在运行时动态获取类信息以及动态调用类中成分的能力叫做Java语言的反射机制。
在这里插入图片描述

2. 获取编译后的Class类对象

反射的关键,或者说第一步,是获取编译后的Class类对象。

2.1 通过java.lang.Class类获取

对于Class类(java.lang.Class),定义了静态方法forName(String className)方法,获取Class类对象,className要写全限名,也就是包名+类名。假设我们在包com.reflective下创建了Student类,可以使用:

Class.forName("com.reflective.Student");

2.2 通过目标类获取

对于要反射的类,可以通过类名.class获得Class类对象。例如Student.class.

2.3 通过目标对象获取

在运行时,可以通过对象.getClass()获得对象所属类的Class类对象,这个是Object类的方法,因此所有类都有这个方法。例如student.getClass().
在这里插入图片描述

3. 反射获取构造器对象

在获得了Class类对象之后,通过调用Class类对象的方法可以获得其构造器对象Constructor。
在这里插入图片描述

3.1 获得Constructor对象

3.1.1 getConstructors()

获取Class类对象中的所有构造器对象,返回值为构造器数组,注意这个方法只能获取public修饰的构造器。

3.1.2 getDeclaredConstructors()

获取Class类对象中的所有构造器对象,返回值为构造器数组,即使是private修饰的构造器也能拿到!

3.1.3 getConstructor()

获取Class类对象中的一个构造器,实参应该依次传入该构造器形参的Class类对象。举个例子:

Class class = student.getClass();
class.getConstructor(String.class, Integer.class);

3.1.4 getDeclaredConstructor()

获取Class类对象中的一个构造器,实参应该依次传入该构造器形参的Class类对象,即使是private修饰的构造器也能拿到。
在这里插入图片描述

3.2 通过构造器初始化对象

获得构造器的作用是初始化一个对象返回。调用构造器的newInsrance方法,并且传入初始化参数(如果构造器需要的话),可以初始化对象并返回。需要注意的是如果是private修饰的构造器,即使获得了也不能直接newInstance,应该先调用构造器的setAccessible(true),才能初始化对象。
在这里插入图片描述

4. 反射获取成员变量对象

在获得了Class类对象后,可以调用Class类对象的方法获得成员变量,并对其赋值或者取值。

在这里插入图片描述

4.1 获得Field对象

4.1.1 getFields()

获取Class类对象的所有public成员变量对象的数组。

4.1.2 getDeclaredFields()

获取Class类对象的所有成员变量对象的数组,即使是private修饰的成员变量也能拿到。

4.1.3 getField()

获取Class类对象的单个public成员变量对象。传入参数为成员变量名字。

4.1.4 getDeclaredField()

获取Class类对象的单个成员变量对象,即使是private修饰的成员变量也能拿到。传入参数为成员变量名字。
在这里插入图片描述

4.2 取值赋值

获得了Field对象后,调用它的set()方法可以为属性赋值,第一个参数传入目标对象,如student,第二个参数传入值;调用get方法可以获得值,传入目标对象。
在这里插入图片描述

5. 反射获取方法对象

在这里插入图片描述

5.1 获得Method对象

5.1.1 getMethods()

调用Class类对象的getMethods()方法,能获得该类的所有public修饰的Method对象的数组。

5.1.2 getDeclaredMethods()

调用Class类对象的getDeclaredMethods()方法,能获得该类的所有Method对象的数组,即使是private修饰也可以获取。

5.1.3 getMethod()

调用Class类对象的getMethod()方法,能获得该类的指定的由public修饰的Method对象,传入第一个参数为方法名,后面的参数为方法形参的Class类,例如String.class。

5.1.4 getDeclaredMethod()

调用Class类对象的getDeclaredMethod()方法,能获得该类的指定的Method对象,传入第一个参数为方法名,后面的参数为方法形参的Class类,例如String.class。即使是private修饰也可以获取。
在这里插入图片描述

5.2 触发该方法执行

获得Method对象之后。调用它的invoke()方法可以触发该方法执行,传入第一个参数为已经实例化的对象,例如student,后面的参数为调用方法需要传递的参数。
如果想执行private修饰的方法,需要先调用Method对象的setAccessible(true)方法,再调用invoke()方法。
在这里插入图片描述

6. 反射的作用

6.1 绕过编译阶段为集合添加数据

集合中如果加了泛型,则只能在该集合中添加这种类型的数据,例如ArrayList,便只能添加Integer类型的数据。泛型只是在编译阶段可以约束集合只能操作某种数据类型,在java文件编译成class文件进入运行阶段的时候,其真实类型都是ArrayList,泛型相当于被擦除了。反射是作用在运行时的技术,因此可以绕过编译阶段为集合添加数据。例如:

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(100);
list.add(200);
//会编译报错
//list.add("word");
Class c = list.getClass();
Method method = c.getDeclaredMethod("add",Object.class);
//list会添加word字符串,并且不会报错
method.invoke(list,"word");

6.2 通用框架的底层原理

使用反射能够实现图中的需求,这个需求其实是通用框架的底层原理。如接受到一个对象后,不清楚成员变量有几个,成员变量名是什么,等。这些都可以通过上面的反射机制来解决,因此通过反射可以完成这些需求。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/7aB0wFH3.shtml

相关文章

JAVA反射机制分析-------spring的通过反射创建bean实例对象以及属性注入的原理解析

JAVA反射机制 java反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c; 能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象,都能够调用他的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的反射机制。 巧妙的利用ja…

【Spring】spring的反射机制详解

一、什么是反射&#xff1a; &#xff08;1&#xff09;Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息&#xff0c;从而操作类或对象的属性和方法。本质是JVM得到class对象之后&#xff0c;再通过class对象进行反编译&#xff0c;从而获取对象的各种信息。 &…

Spring————java的反射机制,Spring的IOC和DI

一、认识Spring 1.1、Spring家族 SpringFramework&#xff1a; Spring框架&#xff1a;是Spring中最早核心的技术&#xff0c;也是所有其他技术及的基础。 SpringBoot:Spring是用来简化开发。而SpringBoot是来帮助Spring在简化的基础上能更快速进行开发。 SpringCloud&#xf…

分布式定时任务调度实战

目录 1、为什么需要定时任务 2、定时任务调度框架 2.1 单机 2.2 分布 3、xxl-job和elastic-job对比 3.1 支持集群部署方式 3.2 多节点部署任务执行方式 3.3 日志可追溯 3.4 监控告警 3.5 弹性扩容缩容 3.6 支持并行调度 3.7 高可用策略 3.8 失败处理策略 3.9 动态…

浅谈传统定时任务和分布式定时任务

为什么用定时任务&#xff1f; 定时任务平台可以在后台自动检测数据并进行操作。主要应用在订单状态改变、后台统计、定时发送邮件或短信等。 定时任务怎么部署实现&#xff1f; 传统的定时任务可以通过可定时线程池、timertask、quartz、spring-schedule方式来进行处理。他…

分布式定时任务技术选型

1、目前的定时任务方案 Java中开发大多数使用Spring-Scheduler&#xff0c;只需要在Spring中的bean的对应方法加上sheduler注解即可完成我们的定时任务&#xff0c;但是光是用这个注解还远远不能保证定时任务执行多次&#xff0c;我们需要一些其他手段的保证&#xff0c;一般来…

java 分布式 定时任务_Java中实现分布式定时任务的方法

定时器Scheduler在平时使用比较频繁&#xff0c;在springboot中&#xff0c;配置好Scheduled和EnableScheduling之后&#xff0c;定时器就能正常执行&#xff0c;实现定时任务的功能。 但是在这样的情况下&#xff1a;如果开发的服务需要水平部署实现负载均衡&#xff0c;那么定…

【手把手】分布式定时任务调度解析之Quartz

1、任务调度背景 在业务系统中有很多这样的场景&#xff1a; 1、账单日或者还款日上午 10 点&#xff0c;给每个信用卡客户发送账单通知&#xff0c;还款通知。如何判断客户的账单日、还款日&#xff0c;完成通知的发送&#xff1f; 2、银行业务系统&#xff0c;夜间要完成跑批…

轻量级分布式定时任务框架XXL-Job

轻量级分布式定时任务框架XXL-Job: XXL-JOB是一款轻量级的分布式定时任务框架&#xff0c;上手简单&#xff0c;操作容易&#xff0c;XXL-Job可以到官网下载也可以去gitee上拉取源码&#xff0c;其中核心模块分页两个&#xff1a;1&#xff1a;是分布式调度服务&#xff0c; 2&…

Springboot结合Redis实现分布式定时任务

一、背景 之前分享过分布式定时任务的技术选型方案&#xff1a;分布式定时任务技术选型方案&#xff0c;个人青睐xxl_job&#xff0c;分享了搭建接入流程&#xff1a;xxl_job搭建方案&#xff0c;本次项目需求较为简单&#xff0c;同时时间紧张。下面介绍利用Redis锁实现分布式…

分布式定时任务框架说明

分布式定时任务框架说明 分布式定时任务框架说明Quartz概念架构组件springboot集成方式使用内存使用数据库 TBSchedule&#xff1a;elastic-job概念架构组件执行流程特性 satumxxl-job概念特性架构组件使用 分布式定时任务框架说明 Quartz 概念 Quartz&#xff1a;Java事实上…

分布式定时任务对比

1. 什么是分布式定时任务 把分散的&#xff0c;可靠性差的计划任务纳入统一的平台&#xff0c;并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 2. 常见开源方案 elastic-job , xxl-job &#xff0c;quartz , saturn, opencron , antares el…

简单粗暴的分布式定时任务解决方案

分布式定时任务 1.为什么需要定时任务&#xff1f;2.数据库实现分布式定时任务3.基于redis实现 1.为什么需要定时任务&#xff1f; 因为有时候我们需要定时的执行一些操作&#xff0c;比如业务中产生的一些临时文件&#xff0c;临时文件不能立即删除&#xff0c;因为不清楚用户…

Java 实现分布式定时任务

文章目录 前言一、技术点二、代码实践1、引入库2、创建启动线程入口3、表结构4、任务解析5、任务拉取 三、结果展示四、总结 前言 最近有一个需求&#xff1a;需要实现分布式定时任务。而市面上的定时任务大多数都是基于Scheduled注解进行实现。不符合需求。所以根据需求整体思…

分布式定时任务调度

前言 什么是分布式定时任务? 把分散的&#xff0c;可靠性差的计划任务纳入统一的平台&#xff0c;并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 为什么要采用分布式定时任务&#xff1f; 单点定时任务的缺点: 功能相对简单&#xff0c…

分布式定时任务-XXL-JOB-教程+实战

一.定时任务概述 1.定时任务认识 1.1.什么是定时任务 定时任务是按照指定时间周期运行任务。使用场景为在某个固定时间点执行&#xff0c;或者周期性的去执行某个任务&#xff0c;比如&#xff1a;每天晚上24点做数据汇总&#xff0c;定时发送短信等。 1.2.常见定时任务方案…

几种常用的分布式定时任务

1. 什么是分布式定时任务 把分散的&#xff0c;可靠性差的计划任务纳入统一的平台&#xff0c;并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 2. 常见开源方案 elastic-job xxl-job quartz saturn opencron antares elastic-job el…

分布式定时任务

分布式定时任务 1&#xff0c;什么是分布式定时任务&#xff1b;2&#xff0c;为什么要采用分布式定时任务&#xff1b;3&#xff0c;怎么样设计实现一个分布式定时任务&#xff1b;4&#xff0c;当前比较流行的分布式定时任务框架&#xff1b; 1&#xff0c;什么是分布式定时…

python类型转换函数str

str函数&#xff0c;将数字转为字符串&#xff1a;

Python 类型转换(数据类型转换函数大全)

文章目录 虽然 Python 是弱类型编程语言&#xff0c;不需要像 Java 或 C 语言那样还要在使用变量前声明变量的类型&#xff0c;但在一些特定场景中&#xff0c;仍然需要用到类型转换。 比如说&#xff0c;我们想通过使用 print() 函数输出信息“您的身高&#xff1a;”以及浮点…