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

489. Java 反射 - 枚举类型的反射操作

文章目录

  • 489. Java 反射 - 枚举类型的反射操作
    • 1. 枚举常量在 JVM 中的本质
    • 2. 示例:获取枚举常量
    • 3. 结合 `Field` 的用法
    • 4. 扩展:动态获取枚举值
    • 🎯 总结

489. Java 反射 - 枚举类型的反射操作

在 Java 中,enum本质上就是一种特殊的类。因此反射 API 不需要为它定义专门的java.lang.reflect.Enum类。大多数枚举相关的反射操作,都和普通类或成员完全一致。

不过,反射仍然提供了三个专门针对枚举的 API

  • Class.isEnum()→ 判断某个Class对象是否表示一个枚举类型。
  • Class.getEnumConstants()→ 获取该枚举中声明的所有常量,按声明顺序返回数组。
  • Field.isEnumConstant()→ 判断某个字段是否是枚举常量。

1. 枚举常量在 JVM 中的本质

  • 每个枚举常量在字节码层面上是一个public static final字段
  • 编译器会为枚举自动生成一些方法,比如values()valueOf(String)
  • 因此,无论是通过枚举类自身调用Days.values(),还是通过反射getEnumConstants(),都能拿到枚举常量数组。

2. 示例:获取枚举常量

定义一个简单的枚举:

publicenumDays{SATURDAY,SUNDAY}

使用反射获取其类信息和常量:

Class<?>c=Days.class;System.out.println("class: "+c.getName());// 常规调用System.out.println("values: "+Arrays.toString(Days.values()));// 反射调用System.out.println("constants: "+Arrays.toString(c.getEnumConstants()));

运行结果:

class:org.devjava.Daysvalues:[SATURDAY,SUNDAY]constants:[SATURDAY,SUNDAY]

📌 可以看到:

  • Days.values()c.getEnumConstants()得到的结果完全一致。
  • 当你没有枚举实例时,getEnumConstants()是获取所有可能值的唯一方式。

3. 结合Field的用法

我们还可以遍历枚举类的字段,并判断哪些字段是枚举常量:

for(Fieldfield:Days.class.getDeclaredFields()){if(field.isEnumConstant()){System.out.println("Enum constant: "+field.getName());}}

输出:

Enumconstant:SATURDAYEnumconstant:SUNDAY

这说明反射能直接识别出哪些字段是枚举常量。


4. 扩展:动态获取枚举值

假设我们有一个方法,只知道枚举类名和常量字符串,却需要得到实际的枚举值:

Class<?>enumClass=Class.forName("org.devjava.Days");Objectsunday=Enum.valueOf((Class<Enum>)enumClass,"SUNDAY");System.out.println("enum value = "+sunday);

运行结果:

enumvalue=SUNDAY

这在配置驱动框架自动注入场景中特别有用。


🎯 总结

  • ✅ 枚举在 JVM 中是,常量是public static final字段。
  • Class.isEnum()→ 判断是否是枚举类。
  • Class.getEnumConstants()→ 获取所有常量(等价于values())。
  • Field.isEnumConstant()→ 判断某个字段是否是枚举常量。
  • ✅ 可以结合Enum.valueOf()实现字符串转枚举实例的动态操作。
http://www.cnnetsun.cn/news/3930419.html

相关文章:

  • [基于OpenEvals的自动化评估-04]基于JSON相似度的评估[无LLM参与的字符匹配]
  • 如何永久备份微信聊天记录:开源工具WeChatMsg的完整解决方案
  • 汽车商城网站建设如何从0到1打造高转化率的线上购车平台?资深开发者真诚分享避坑指南
  • 风电功率预测数据集解析与LSTM模型实战
  • 终极指南:5个简单步骤在macOS上运行Windows应用
  • Arcade-plus:免费开源的专业Arcaea谱面编辑器终极指南
  • Claude Code Hooks:基于事件驱动的AI编程自动化实战指南
  • AI图像生成项目本地部署与测试全流程指南
  • Arcade-plus:免费开源的专业级Arcaea谱面编辑器完整指南
  • 邱县网站建设: 本地企业如何跳出低价陷阱,打造真正能获客的官方网站
  • Unity游戏AI知识库实战:基于RAG技术构建NPC专属记忆
  • 2026年辽宁做城市生命线安全工程建设的公司有哪些?
  • 3步解锁音乐自由:ncmdump网易云NCM格式解密完全指南
  • UE5蓝图实现2.5D动态设置菜单:3D模型交互与动画反馈系统
  • MuseTalk实战指南:5分钟学会AI唇音同步,让虚拟人说话更自然
  • AI Agent开发实战:从工具调用到工作流编排的完整指南
  • 腾讯云Lighthouse部署OpenClaw AI助手:从零到一的完整实践指南
  • 佛山网站建设与设计公司哪家好?揭秘优质服务商背后的选择智慧与避坑指南
  • ESP32音频流媒体架构设计:从本地存储到网络音频的完整实现路径
  • Python疫情数据可视化系统开发实战
  • APaaS平台一键安装实战:从Docker部署到生产环境优化
  • AI论文降重工具实战:嘎嘎降AI高效使用指南
  • 智能体框架版本升级踩坑指南:从Hermes v0.19问题看自动化工具稳健实践
  • NAND堆叠技术深度解析:从100层到900层,垂直堆叠的工程极限在哪里?
  • C++多态与虚函数实现详解
  • Illustrator脚本大全:12个提升Adobe设计效率的终极工具指南
  • 第5讲:数据集建设完整指南——质量决定上限
  • 分布式电源与储能系统优化规划及MATLAB实现
  • 商业网站建设的方法详解:如何打造高转化率的线上商业站点
  • go2_ros2_sdk实战:深度解析MID-360激光雷达多传感器集成方案