Java 反射 理解

article/2025/10/10 0:15:16

Java 反射

定义

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。

简而言之,反射机制可以获取任意一个类的字节码,并通过这个字节码文件创建出类对象,访问该对象。

关键词:任意,可见Java的反射机制是非常灵活的,在spring框架中得到了充分的应用 - 配置文件和类的自动装配,即 IOC 机制。

如何反射?

要使用反射机制反射出一个类,那么必须先获得类的字节码文件对象,即 .class。

如何获取类的字节码文件?有几种方式?

  1. 调用某个类的对象实例的 getClass() 方法获取

    Cat cat = new Cat();
    Class c = cat.getClass();
    
  2. 直接调用类的 .class 属性

    Class c = Cat.class();
    
  3. 使用 Class 的 forName(String className) 方法,通过类的全路径名

    Class c = Class.forName("reflect.Cat");
    reflect.CatCat 类的全路径名
    

由于第三种方式不需要事先创建类,或者获取类,所以更灵活。 Spring 就是用这样的方式进行组件的创建,根据配置文件和反射机制和IOC创建、获取、装配组件。

使用场景

1、通过反射机制破坏单例模式

单例模式中,类的构造方法都是设置为 private 的,所以使用常规的 new 是无法创建对象的。但是,反射机制可以。

做法:我们可以先获取类的字节码文件,然后通过字节码文件获取类的构造器,将构造器可访问权限设置为 true,调用构造器的 newInstance() 获取一个对象实例。

class Cat {String name;private Cat() {}
}public class ReflectTest {public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, ClassNotFoundException {Class<Cat> catClass = Cat.class;Constructor<Cat> cata = catClass.getDeclaredConstructor();cata.setAccessible(true);Cat cat1 = cata.newInstance();Cat cat2 = Cat.getCat();System.out.println(cat1);System.out.println(cat2);}
}

输出:

得到两个不同的对象!

2、Spring的IOC机制中的应用

Spring 是如何帮我们创建对象,并放到容器中?IOC 机制

实际上 IOC机制实际上就是使用了反射机制来实现的。

我们看下,下面的伪代码实现过程:

//解析<bean .../>元素的id属性得到该字符串值为"sqlSessionFactory" 
String idStr = "sqlSessionFactory";  
//解析<bean .../>元素的class属性得到该字符串值为"org.mybatis.spring.SqlSessionFactoryBean"  
String classStr = "org.mybatis.spring.SqlSessionFactoryBean";  
//利用反射知识,通过classStr获取Class类对象  
Class cls = Class.forName(classStr);  
//实例化对象  
Object obj = cls.newInstance();  
//container表示Spring容器  
container.put(idStr, obj);  //当一个类里面需要用另一类的对象时,我们继续下面的操作//解析<property .../>元素的name属性得到该字符串值为“dataSource”  
String nameStr = "dataSource";  
//解析<property .../>元素的ref属性得到该字符串值为“dataSource”  
String refStr = "dataSource";  
//生成将要调用setter方法名  
String setterName = "set" + nameStr.substring(0, 1).toUpperCase() 						+ nameStr.substring(1);  
//获取spring容器中名为refStr的Bean,该Bean将会作为传入参数  
Object paramBean = container.get(refStr);  
//获取setter方法的Method类,此处的cls是刚才反射代码得到的Class对象  
Method setter = cls.getMethod(setterName, paramBean.getClass());  
//调用invoke()方法,此处的obj是刚才反射代码得到的Object对象  
setter.invoke(obj, paramBean);  

是不是很熟悉,虽然是伪代码,但是和我们本篇讲的反射机制的使用是相同的,现在知道我们的反射机制用在哪了吧,没错就是我们经常提到的Java web框架中,里面就用到了反射机制,只要在代码或配置文件中看到类的完全限定名(包名+类名),即完整路径名,其底层原理基本上使用的就是Java的反射机制。

ref:

  1. https://blog.csdn.net/Appleyk/article/details/77879073
  2. https://codeantenna.com/a/USAuldhCFd

http://chatgpt.dhexx.cn/article/xWWpjaF9.shtml

相关文章

Java反射机制的原理和用途

看了好多关于Java反射机制的文章&#xff0c;大多都太过官方&#xff0c;消化起来比较稍显费劲&#xff0c;本篇&#xff0c;我会依据自己的理解去阐述什么是Java的反射机制&#xff0c;反射用在什么地方&#xff0c;以及怎么来使用&#xff1f; 开篇前&#xff0c;我们还是要了…

Java反射详解及作用

参考视频链接: 哔哩哔哩视频. 1. 反射概述 能够分析类能力的程序叫做反射(reflective)&#xff0c;对于任何一个Class类&#xff0c;反射可以在运行时直接得到这个类的全部成分&#xff0c;包括构造器&#xff0c;成员方法&#xff0c;成员变量。获得的构造器对象为Construct…

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;什么是分布式定时…