什么是反射,反射用途,spring哪些地方用到了反射,我们项目中哪些地方用到了反射

3分钟搞懂Java反射

一、反射是什么

在Java中,反射(Reflection)是一种强大的工具,它允许程序在运行时获取和操作类、接口、构造器、方法和字段等。反射是Java语言的一个重要特性,它为开发人员提供了许多灵活性,尤其是在构建框架和库时非常有用。

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

1.Class c1 =类名.class

public class MyClass {public static void main(String[] args) {Class<?> myClass = MyClass.class; // 获取 MyClass 的 Class 对象System.out.println(myClass.getName()); // 输出: com.beiyou.example.MyClass}
}

2.通过 instance.getClass() 方法,如果你有一个类的实例,你可以调用 getClass() 方法来获取其 Class 对象

public class MyClass {public static void main(String[] args) {MyClass instance = new MyClass();Class<?> myClass = instance.getClass(); // 获取 MyClass 实例的 Class 对象System.out.println(myClass.getName()); // 输出: com.beiyou.example.MyClass}
}

3.通过 Class.forName() 方法,通过全类名动态加载类,并获取其 Class 对象

public class MyClass {public static void main(String[] args) throws ClassNotFoundException {Class<?> myClass = Class.forName("com.example.MyClass"); // 动态加载 MyClass 的 Class 对象System.out.println(myClass.getName()); // 输出: com.example.MyClass}
}

Java

三、反射的主要用途包括

1.获取类信息:获取类名、包名、父类、接口等。

获取类名:myClass.getName()

获取类的属性:c1.getField(),只能获取public修饰的属性,getDeclaredField(),获取任意修饰符修饰的属性

获取方法:c1.getMethod(),只能获取public的方法,getDeclaredMethodes()获取任意修饰符修饰的方法,

2.创建实例:通过类名或Class对象动态创建实例。

3.访问类成员:获取并操作类的字段、方法和构造器。

也可以使用 Hutool 中的ReflectUtil 类中的方法来操作类的方法和属性。使用Hutool前记得引用Hutool

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.26</version>
</dependency>

例子:首先创建一个基类

import lombok.Data;@Data
public class Student {public int id;public String name;private int age;public Student() {}public Student(int id, String name, int age) {this.id = id;this.name = name;this.age = age;System.out.println("这是构造");}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}public void say() {System.out.println("hello++++++");}public void eat() {System.out.println("吃饭------");}
}

测试类test1

import cn.hutool.core.util.ReflectUtil;
import com.beiyou.model.Student;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;@SpringBootTest
class RefleUtilAppTests {//创建实例Student student = ReflectUtil.newInstance(Student.class, 1, "张三", 18);@Testvoid test1() {//构造Constructor<Student> constructor = ReflectUtil.getConstructor(Student.class);// 获取字段Field field = ReflectUtil.getField(Student.class, "name");
//        Map<String, Field> fieldMap = ReflectUtil.getFieldMap(Student.class);//获取所有字段Field[] fields = ReflectUtil.getFields(Student.class);//设置字段值ReflectUtil.setFieldValue(student, "name", "李四");//获取指定字段值Object fieldValue = ReflectUtil.getFieldValue(student, "name");}@Testvoid test2() {Student student = ReflectUtil.newInstance(Student.class, 1, "张三", 18);// 获取所有方法Method[] methods = ReflectUtil.getMethods(Student.class);for (Method m : methods) {System.out.println(m.getName());}// 获取指定方法Method method = ReflectUtil.getMethod(Student.class, "say");System.out.println(method.getName());// 执行方法ReflectUtil.invoke(student, "say");}}

测试类2

import cn.hutool.core.util.ReflectUtil;
import com.beiyou.model.Student;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;class ReflectionAppTests {public static void main(String[] args)   {Class<?> studentClass = null;try {//获取类对象studentClass = Class.forName("com.beiyou.model.Student");// 获取构造器Constructor<?> constructor = studentClass.getConstructor();//创建实例Object instance = studentClass.newInstance();//获取属性Field name = studentClass.getField("name");name.set(instance, "张三");System.out.println("name : " + name.get(instance));Field age = studentClass.getDeclaredField("age");age.setAccessible(true);age.set(instance, 20);System.out.println(" age : " + age.get(instance));} catch (Exception e) {e.printStackTrace();}}
}

效率:通过new获取对象的操作要比通过反射获取对象速度快得多。根据情况选择使用new还是反射。

四、Spring框架中哪里用到了反射

1. 依赖注入:Spring通常使用反射机制来创建和初始化 Bean。

依赖注入三种方式:构造方法注入,set方法注入和属性注入

2. AOP:代理方式分为动态代理和静态代理,静态代理是我们手写的,动态代理分为Spring动态Spring AOP 使用 JDK 动态代理或者 CGLIB 字节码增强技术来实现 AOP 的切面逻辑,这其中就包含了对被代理对象方法的反射调用。JDK 动态代理适用于实现了接口的目标对象。Spring 使用 java.lang.reflect.Proxy 类来创建代理对象,并且使用 InvocationHandler 接口来定义方法拦截逻辑。

3. MVC 框架:Spring MVC 框架使用反射来调用相应的控制器方法,从而实现请求的处理。

4. 数据库访问框架:Spring 的 JDBC 框架使用反射机制来实现对数据库的访问。

5. 容器管理:Spring 容器也使用了反射机制来管理对象的实例化和依赖注入。

五、我们在项目哪里用到了反射

MyBatis拦截器处理参数时使用,在做WMS仓储系统时,我们的数据表中都有lastUpdatBy这个字段,我们绝大多数业务都需要对lastUpdateBy进行赋值,所以我们就在Mybatis拦截器中通过反射获取参数,然后通过ThreadLocal中的localuser进行统一对其赋值。ThreadLocal为每一个线程提供一个独立的变量副本,使得每个线程在访问变量时获取的都是自己独有的线程副本,ThreadLocal能够实现跨类跨方法实现变量的传递。我们定义了一个LocalUser对象存储在ThreadLocal中,然后就可以获取ThreadLocal中的Localuser对象为lastUpdateBy赋值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/430685.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

50页PPT麦肯锡精益运营转型五步法

读者朋友大家好&#xff0c;最近有会员朋友咨询晓雯&#xff0c;需要《 50页PPT麦肯锡精益运营转型五步法》资料&#xff0c;欢迎大家下载学习。 知识星球已上传的资料链接&#xff1a; 企业架构 企业架构 (EA) 设计咨询项目-企业架构治理(EAM)现状诊断 105页PPTHW企业架构设…

收据信息提取系统源码分享

收据信息提取检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

vue-baidu-map的基本使用

前言 公司项目需求引入百度地图&#xff0c;由于给的时间比较短&#xff0c;所以就用了已经封装好了的vue-baidu-map 一、vue-baidu-map是什么&#xff1f; vue-baidu-map是基于vue.js封装的百度地图组件(官方文档) 二、使用步骤 1.下载插件 //我下载的版本 npm install …

在虚幻引擎中实现Camera Shake 相机抖动/震屏效果

在虚幻引擎游戏中创建相机抖动有时能让画面更加高级 , 比如 遇到大型的Boss , 出现一些炫酷的特效 加一些短而快的 Camera Shake 能达到很好的效果 , 为玩家提供沉浸感 创建Camera Shake 调整Shake参数 到第三人称或第一人称蓝图 调用Camera Shake Radius值越大 晃动越强

vscode缩进 和自动格式化

如下图&#xff0c;缩进太大了。 检查2个地方 prettierrc.cjs文件。此处决定缩进几个tab vscode 的设置。 保存的时候 格式化。

数据结构——顺序表、链表

目录 前言 一&#xff0c;数据结构 1&#xff0c;什么是数据结构&#xff1f; 2&#xff0c;有什么类型&#xff1f; 二&#xff0c;顺序表 1&#xff0c;线性表 2&#xff0c;顺序表基本结构 3&#xff0c;动态顺序表的功能实现 三&#xff0c;链表 1&#xff0c;链…

AI大模型微调训练营,全面解析微调技术理论,掌握大模型微调核心技能

一、引言 随着人工智能技术的飞速发展&#xff0c;大型预训练模型&#xff08;如GPT、BERT、Transformer等&#xff09;已成为自然语言处理、图像识别等领域的核心工具。然而&#xff0c;这些大模型在直接应用于特定任务时&#xff0c;往往无法直接达到理想的性能。因此&#…

RPA + 计算机视觉

随着超自动化成为顶级企业技术趋势之一&#xff0c;领先的机器人流程自动化 (RPA) 公司开始将人工智能功能集成到其自动化工具中&#xff0c;以创建能够自动化端到端流程并做出决策的智能机器人。计算机视觉是新一代 RPA 工具的关键 AI 功能之一。 在本文中&#xff0c;我们将…

Elasticsearch:检索增强生成背后的重要思想

作者&#xff1a;来自 Elastic Jessica L. Moszkowicz 星期天晚上 10 点&#xff0c;我九年级的女儿哭着冲进我的房间。她说她对代数一无所知&#xff0c;注定要失败。我进入超级妈妈模式&#xff0c;却发现我一点高中数学知识都不记得了。于是&#xff0c;我做了任何一位超级妈…

web学习——VUE

VUE&Element 今日目标&#xff1a; 能够使用VUE中常用指令和插值表达式能够使用VUE生命周期函数 mounted能够进行简单的 Element 页面修改能够完成查询所有功能能够完成添加功能 1&#xff0c;VUE 1.1 概述 接下来我们学习一款前端的框架&#xff0c;就是 VUE。 Vue 是…

二.python基础语法

目录 1.第一个python实例 2.python编码规范 2.1.编写规则 2.2.命名规范 2.3. 空格 2.4. 缩进 2.5. 注释 3.python关键字和标识符 3.1.标识符 3.2.关键字 4.python变量 4.1. 定义变量 4.2. 变量类型是可变的 4.3. 多个变量指向同一个值 5.python基本数据类型 5.…

OpenCV特征检测(12)检测图像中的潜在角点函数preCornerDetect()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算用于角点检测的特征图。 该函数计算源图像的基于复杂空间导数的函数 dst ( D x src ) 2 ⋅ D y y src ( D y src ) 2 ⋅ D x x src − 2 …

流水线部署失败排查指南

在现代软件开发中&#xff0c;CI/CD&#xff08;持续集成/持续交付&#xff09;流水线是确保代码质量和快速交付的重要工具。然而&#xff0c;部署失败时&#xff0c;排查问题的能力至关重要。以下是一些常见的故障排查步骤和技巧。 ## 1. 检查流水线日志 首先&#xff0c;查看…

一文讲清楚0基础小白如何快速入门大语言模型

1、快速一览 读完可以收获&#xff1a; 快速建立大语言模型的概念、基本原理。 几个概念之间的关系&#xff1a; 人工智能&#xff1a;让机器&#xff08;或系统&#xff09;像人一样思考行动。 机器学习&#xff1a;从数据中寻找规律、建立关系&#xff0c;根据建立的关系去…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【LMS调测】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 LMS全称为Lite Memory Sanitizer&#xff0c;是一种实时…

31省市农业地图大数据

1.北京市 谷类作物种植结构&#xff08;万亩&#xff09; 农作物种植结构&#xff08;万亩&#xff09; 2.天津市 谷类作物种植结构&#xff08;万亩&#xff09; 农作物种植结构&#xff08;万亩&#xff09; 3.黑龙江省 谷类作物种植结构&#xff08;万亩&#xff09; 农作物…

Appium自动化测试概述

Appium是一个可用于测试iOS、 Android操作系统和Windows桌面平台原生应用,移动网页应用和混合应用的自动化测试框架。 原生应用(Native App):用 android、iOS或者Windows SDK编写的应用 移动网页应用(Web App):通过手机浏览器访问的网页应用,比如iOS中 safari应用,And…

Apache Iceberg Architecture—Iceberg 架构详解

Apache Iceberg Architecture Apache Iceberg 的架构可以分为三个主要层次&#xff1a;Iceberg Catalog、元数据层和数据层。 一、 Iceberg Catalog&#xff08;目录&#xff09; Iceberg Catalog 是 Iceberg 的顶层组件&#xff0c;负责管理所有 Iceberg 表的元数据和元数据操…

实现一个基于nio的discard server

写在前面 源码 。 为了能够进一步的熟悉下nio相关的api操作&#xff0c;本文来实现一个基于nio的discard server。 discard server的意思是&#xff0c;server接收到来自client的一个消息之后&#xff0c;直接就将连接关闭&#xff0c;即discard。 1&#xff1a;正戏 1.1&…

振弦式渗压计智慧水利工程 适用恶劣环境有保障

产品概述 振弦式渗压计适合埋设在水工建筑物和基岩内&#xff0c;或安装在测压管、钻孔、堤坝、管道或压力容器中&#xff0c;以测量孔隙水压力或液位。主要部件均采用特殊钢材制造&#xff0c;适合在各种恶劣环境中使用。特殊的稳定补偿技术使传感器具有极小的温度补偿系数。…