当前位置: 首页 > news >正文

JAVA基础之反射

一、什么是反射

Java 反射允许程序在运行时,获取类的完整信息(构造、属性、方法),并且可以操作它们(创建对象、赋值、调用方法),无视 private 修饰符!

正常写代码:必须要知道类名、方法名、而且不能访问private

Student s = new Student(); s.name = "张三"; s.study();

反射写代码:不知道具体细节,依旧可以创建对象,调用私有方法、修改私有属性

//引号里面是类的位置 Class clazz = Class.forName("com.test.Student");

二、核心作用

  • 运行时获取类信息:包名、类名、父类、接口、构造、属性、方法
  • 运行时创建对象:哪怕构造器是 private
  • 运行时操作属性:修改 / 获取 private、final、static 属性
  • 运行时调用方法:调用 private 方法、静态方法
  • 框架底层核心技术:Spring、MyBatis、SpringBoot 全靠反射

三、反射的核心API

首先要获取class对象,后续的方法才可以实现:

类型核心类作用
类对象Class<?>代表一个类,反射的入口
构造器Constructor操作构造方法,创建对象
属性Field操作成员变量(赋值 / 取值)
方法Method调用普通 / 静态方法
权限setAccessible(true)破解 private

其中获取类对象有三种方式:

  • 类名.class
  • 对象.getClass()
  • Class.forName("全类名")

这时候有个疑问:反射是如何获取的呢?

先来了解一下类加载过程:当我们在终端运行javac命令时,会把源代码文件(.java)变成二进制字节码文件(.class),运行java命令后,JVM启动,开始处理.class文件,生成类对象,之后再创建实例对象

在以上过程描述中,分别对应获取class对象的三种方式:

(1)磁盘文件阶段(如图左边)中使用的是:Class.forName("全类名"),这是一种在运行时动态加载类的方式

(2)在编译期间(JVM处理.class文件)使用的是:类名.class,这种方式不需要创建实例对象,直接通过类名获取

(3)运行时阶段(创建了实例对象)使用的是:对象名.getClass(),这个逻辑是当你有了一个实例对象时,可以反向获取他所属类的Class对象

虽然阶段不同,但是无论哪种方式得到的都是同一个Class对象

四、具体使用

使用步骤:1.获取Class对象(对象入口)2.获取要操作的成员(构造/属性/方法)3.开启暴力反射(setAccessible(true))4.执行操作(创建对象 / 赋值 / 调用方法)

在获取的时候,方法分为两类:有Drclared:所有权限都可以获取;无Declared:只获取public权限

1.获取成员变量 Field

getDeclaredFields():获取当前类中所有变量(private /default/protected /public),不包含父类

getFields():只获取public成员变量,包含父类

getDeclaredField("变量名"):获取指定名字的单个变量(任意权限)

getField("变量名"):获取指定名字的public变量

2.获取成员方法 Method

getDeclaredMethods():获取本类所有方法(private /default/protected /public),不包含父类

getMethods():只获取public方法,包含父类

getDeclaredMethod("show", String.class):获取指定方法(任意权限)

getMethod("show", String.class):获取指定的public方法

3.获取构造器 Constructor

getDeclaredConstructors():获取本类所有构造器

getConstructors():获取public构造器

getDeclaredConstructor(String.class):获取指定参数的构造器

getConstructor(参数类型...):获取指定public构造器

4.暴力反射

setAccessible(true):关闭Java 访问检查,可以操作 private 构造、private 变量、private 方法

那什么时候需要暴力反射,什么时候不需要?那就是看private:使用private修饰的,需要暴力反射,非private不需要暴力反射

5.创建对象实例

分为有参和无参

//无参 Animal animal1 = (Animal) declaredConstructor.newInstance(); //有参 Animal animal2 = (Animal) del2.newInstance("小猫");

6.操作成员相关方法

注意在获取之前,private修饰的变量,要进行暴力反射

get():获取成员变量值

set():修改成员变量值

invoke(实例对象):调用成员方法

五、反射优缺点

优点:

  • 运行时动态获取类信息、动态创建对象
  • 解耦,提高程序灵活性
  • 框架底层核心技术

缺点:

  • 性能比正常代码慢
  • 破坏封装性,可以访问私有成员
  • 代码复杂,可读性差
http://www.jsqmd.com/news/707383/

相关文章:

  • H.266/VVC编解码技术解析与开源实现VVenC/VVdeC
  • STM32简介与选型
  • Java的java.lang.foreign优化模式
  • 英语阅读_choosing a career in your future
  • UG/NX二次开发实战:如何为选择对象控件设计一个健壮的“清空”功能(附NX12.0.2.9代码)
  • 别再只把VRRP当主备了!实战配置华为/华三交换机实现负载分担,让网络带宽翻倍
  • KBase 深度解析:蚂蚁数科的金融级知识工程“发动机”
  • idea的java项目如何用exe4j来打包jar成exe并手动配置jre?
  • Transformer模型推理优化实战指南
  • 从‘锯齿波’到‘马鞍波’:一个嵌入式工程师调试异步电机FOC的实战笔记
  • 2026靠谱的黄山市网红民宿怎么选厂家推荐榜,商务型/亲子型/观景型/网红打卡型/经济型厂家选择指南 - 海棠依旧大
  • 用STM32CubeMX和HAL库5分钟搞定TCRT5000循迹小车(附完整代码)
  • Notte框架:混合智能体模式实现低成本高可靠的Web自动化
  • 法律AI实战:基于RAG与大模型微调构建智能法律助手
  • 手把手教你为UniApp微信小程序项目配置安全的WSS WebSocket连接(Vue3版)
  • 2026环保装备数字孪生平台对比选型
  • 本地AI助手AgenticSeek部署指南:私有化自主代理框架实践
  • 机器学习新手必知的10大误区与解决方案
  • JS Agent实战指南:从零构建企业级AI智能体应用
  • 2026市面上成都空调深度清洗公司排行厂家推荐榜,分体式/中央空调/商用中央空调深度清洗厂家选择指南 - 海棠依旧大
  • 告别懵圈!用示波器实测LIN总线报文帧,手把手教你分析同步间隔与校验和
  • 西门子博途V17程序块加密实战:从‘专有技术保护’到‘防拷贝’,手把手教你保护PLC代码(附避坑点)
  • Janus-Pro-7B MySQL数据库优化顾问:慢查询分析与索引建议
  • Arm CMN-600处理器事件接口设计与低功耗优化
  • 监督学习实战指南:从原理到工业应用
  • 神经网络中的微分运算:原理、实现与优化实践
  • Python asyncio 信号处理机制
  • 2026评价高的北京防水施工机构怎么选择厂家推荐榜:SBS改性沥青、高分子卷材、聚氨酯涂料、非固化橡胶沥青、自粘卷材厂家选择指南 - 海棠依旧大
  • 2026年实测10款降AI率神器:免费降低AI率,论文降AIGC轻松搞定! - 降AI实验室
  • 从战斗机翻滚到游戏角色转向:四元数如何成为3D旋转的‘隐形冠军’?