相关文章推荐
愤怒的消炎药  ·  Windows中的库编程(一、动态库介绍及如 ...·  1 年前    · 
悲伤的麻辣香锅  ·  吓人,5秒钟偷走你的声音 - 掘金·  1 年前    · 
活泼的石榴  ·  正则表达式 – 运算符优先级 | 菜鸟教程·  2 年前    · 
深情的楼房  ·  big.js首页、文档和下载 - 小型快速 ...·  2 年前    · 
文质彬彬的黑框眼镜  ·  czhko的个人空间-czhko个人主页-哔 ...·  2 年前    · 
Code  ›  java 反射读取枚举值上的注解信息-天翼云
string 运营商 天翼云 天翼
https://www.ctyun.cn/zhishi/p-257702
个性的鸡蛋面
2 年前

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
查看全部活动
热门活动
  • 818·全民上云季 NEW 2核2G云主机只要47.4元/3个月起
  • 算力套餐 NEW 让算力触手可及
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 中小企业上云场景组合购 NEW 建站、域名等场景一站式购齐,组合购9元起!
  • 天翼云·创新直播间 NEW 与专家共同解读云计算领域前沿趋势
  • 新客特惠 NEW 全场热销云主机2.5折!
  • 天翼云电脑专场 HOT 移动办公神器天翼云电脑4核8G畅享3个月只要130元起!
  • 云主机特惠 HOT 多款云主机新老同享,满足您的上云需求!
免费活动
  • 企业免费试用专区 HOT 数十款产品免费试用,完成企业实名认证领取2000元试用金!
  • 个人免费试用专区 HOT 完成个人实名认证即可获得1000元试用金!
  • 新客特惠 全场云主机2.5折起
  • 云上安全专场 安全产品全场6折起!

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务。
进入甄选商城 进入云市场
办公协同
  • WPS云文档天翼云版 翼企云( License版) 天翼云企业云盘(标准服务版) 蓝信安全移动工作平台(SAAS) SSL证书 新域名服务 税务风控云 商企云财税(SAAS版) 翼云加速-标准版包月套餐 天翼云管家2.0 天翼云管家 翼备份(SaaS版)300G 智慧工厂_生产流程管理解决方案 天翼智慧工地 天翼全栈混合云敏捷版(软件) 天翼全栈混合云敏捷版(一体机)

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云技术合作伙伴
  • 天翼云OpenAPI中心 天翼云诸葛AI平台 天翼云EasyCoding平台
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云培训认证
  • 天翼云学堂 天翼云市场商学院
天翼云服务合作伙伴
  • 天翼云MSP合作伙伴
天翼云合作计划
  • 央企云合作计划
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴 天翼云甄选商城合作伙伴

开发者

开发者相关功能入口汇聚
技术社区
资源与工具
  • 天翼云OpenAPI EasyCoding敏捷开发平台 AI创作间
培训与认证
  • 天翼云学堂 天翼云认证

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • OpenAPI中心 客户支持计划

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云 天翼云4.0 天翼云APP 全球基础设施 分析师和白皮书 2023云生态大会 2022云生态大会 天翼云中国行 支持与服务 了解天翼云
  • 站点切换
    • 中国站
  • 文档
  • 控制中心
  • 备案
  • 管理中心

java 反射读取枚举值上的注解信息

首页 知识中心 其他 文章详情页

java 反射读取枚举值上的注解信息

2023-07-26 08:08:55 阅读次数:10

java, 枚举, 注解

JAVASE 的API并没有提供获取枚举值注解信息的方法,只能获取到enum类上的注解,但是有一种场景:通过注解为枚举值增加额外的功能。

enum作为数据字典,当为enum的各个枚举值增加一个新的属性值时,有两种方式:

  • 增加一个属性值,通过多种参数的构造方法,来实现;
  • 增加一个注解,并且放置在枚举值上;
    本文来实现第二种方式,遇见的难题:JAVASE 的API并没有提供获取枚举值注解信息的方法,只能获取到enum类上的注解。
  • 解决办法: 通过获取枚举值Field对象 ,来实现:

    代码实现
    两个注解:需要去增强枚举值的功能

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.FIELD, ElementType.TYPE})
    public @interface Log {
        //是否开启
        boolean open() default false;
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.FIELD, ElementType.TYPE})
    public @interface Cost {
        double min();
        double max();
    
    public enum StudyEnum {
        @Log(open = true)
        @Cost(min = 10.0, max = 99.0)
        JAVA("java", "java基础"),
        @Cost(min = 20.0, max = 79.0)
        PHP("php", "php基础");
        private String actualName;
        private String desc;
        public String getActualName() {
            return actualName;
        public void setActualName(String actualName) {
            this.actualName = actualName;
        public String getDesc() {
            return desc;
        public void setDesc(String desc) {
            this.desc = desc;
        private static final Map<String, Cost> costCache = new HashMap<>();
        private static final Map<String, Log> logCache = new HashMap<>();
        private static final Map<String, StudyEnum> cache = new HashMap<>();
        StudyEnum(String actualName, String desc) {
            this.actualName = actualName;
            this.desc = desc;
        //对象初始化时,执行下面的方法,将注解上的枚举值解析到cache中
        static {
            //将枚举属性值的name和Field映射为Map
            Map<String, Field> fieldCache = Arrays.stream(StudyEnum.class.getDeclaredFields()).
                    filter(Field::isEnumConstant).
                    collect(Collectors.toMap(Field::getName, Function.identity()));
            //遍历所有的枚举值
            for (StudyEnum studyEnum : StudyEnum.class.getEnumConstants()) {
                String keyName = studyEnum.name();
                //原始的cache
                cache.put(keyName, studyEnum);
                Field field = fieldCache.get(keyName);
                //不包含原始,则停止解析
                if (!field.isAnnotationPresent(Log.class) || !field.isAnnotationPresent(Cost.class)) {
                    continue;
                //获取日志注解
                parsingLogAnno(keyName, field);
                //获取价格注解
                parsingCostAnno(keyName, field);
         * 获取注解的属性
        public static StudyEnumInfo resolve
    
    
    
    
        
    (String name) {
            StudyEnum studyEnum = cache.get(name);
            if (studyEnum == null) {
                return null;
            Log log = logCache.get(name);
            Cost cost = costCache.get(name);
            StudyEnumInfo studyEnumInfo = new StudyEnumInfo();
            studyEnumInfo.setName(studyEnumInfo.name);
            studyEnumInfo.setDesc(studyEnum.desc);
            studyEnumInfo.setLogAnno(log);
            studyEnumInfo.setCostAnno(cost);
            return studyEnumInfo;
         * 获取注解的属性
        public StudyEnumInfo resolve() {
            return resolve(this.name());
        //解析日志注解
        private static void parsingLogAnno(String keyName, Field field) {
            Log logAnno = field.getDeclaredAnnotation(Log.class);
            if (logAnno != null) {
                logCache.put(keyName, logAnno);
        //解析花费注解
        private static void parsingCostAnno(String keyName, Field field) {
            Cost costAnno = field.getDeclaredAnnotation(Cost.class);
            if (costAnno != null) {
                costCache.put(keyName, costAnno);
        @Data
        public static class StudyEnumInfo {
            private String name;
            private String desc;
            private Log logAnno;
            private Cost costAnno;
    
    public class Test {
        //完成对象的解析
        public static void main(String[] args) {
            //info对象
            StudyEnum.StudyEnumInfo info = StudyEnum.JAVA.resolve();
            System.out.println(info.getCostAnno().max());
            System.out.println(info.getLogAnno().open());
    

    java 反射读取枚举值上的注解信息

    版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/qq_44732146/article/details/126800325,作者:胡八一,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

    上一篇: LOG_PATH_IS_UNDEFINED 解决

    下一篇: java:Exception in thread “main“ java.lang.UnsupportedOperationException

    相关文章

    2023-08-09 07:17:16

    Java学习Set之HashSet集合保证元素唯一性源码分析

    Java学习Set之HashSet集合保证元素唯一性源码分析

    2023-08-09 07:17:07

    使用datart连接hive报org.apache.thrift.transport.TTransport

    报错Caused by: java.lang.ClassNotFoundException: org.apache.thrift.transport.TTransport报错原因是因为我只加了hive-jdbc的包,无所加载到其他的类解决方

    apache
    2023-08-09 07:17:07

    kerberos开启后服务报错Unable to obtain password from user

    异常日志原因及解决办法错误提示是认证时不能获取密码。原因是手动生成的keytab文件其owner是root,应该改成对应组件的系统用户解决方案

    apache hadoop
    2023-08-09 07:17:07

    跨集群distcp数据的时候报错异常java.nio.channels.UnresolvedAddressException

    异常解决方案:(异常的原因是因为跨集群的时候无法解析跨集群的namenode的主机导致的)需要把两个集群的hosts合并重新distcp后数据正常

    apache hadoop
    2023-08-09 07:16:48

    IDEA 自定义注解(类注释、方法注释)

    IDEA 自定义注解(类注释、方法注释)

    2023-08-09 07:15:36

    H2 数据库的 expected “identifier 错误

    H2 数据库的 expected “identifier 错误

    2023-08-09 06:48:08

    定时任务@Scheduled 和 异步@Async

    定时任务@Scheduled 和 异步@Async

    2023-08-09 06:47:58

    IDEA配置热部署Devtools(微服务开发必备)

    IDEA配置热部署Devtools(微服务开发必备)

    2023-08-09 06:47:58

    Java8 Stream,常用方法大合集

    Java8 Stream,常用方法大合集

    System
    2023-08-09 06:47:58

    Dubbo及Zookeeper安装

    Dubbo及Zookeeper安装

    zookeeper

    作者介绍

    天翼云小翼
    天翼云用户

    文章

    20373

    阅读量

    1130002

    查看更多

    最新文章

    使用datart连接hive报org.apache.thrift.transport.TTransport

    2023-08-09 07:17:07

    kerberos开启后服务报错Unable to obtain password from user

    2023-08-09 07:17:07

    IDEA 自定义注解(类注释、方法注释)

    2023-08-09 07:16:48

    Dubbo及Zookeeper安装

    2023-08-09 06:47:58

    JAVA深层拷贝 - DeepCopy

    2023-08-07 07:24:54

    设计模式-------------静态/动态代理模式(结构型设计模式)

    2023-08-04 08:03:01

    查看更多

    热门文章

    GC是什么? 为什么要有GC?

    2023-05-10 06:02:16

    在java正则表达式中为什么要对 . 进行两次的转义操作 (\\.)才表示真正的 .

    2023-05-15 10:01:56

    axios&spring前后端分离传参规范总结

    2023-05-22 08:09:06

    Jsp Ajax之模拟用户注册

    2022-11-17 12:37:24

    定义一个函数,接收三个参数返回一元二次方程

    2023-02-13 07:59:59

    IDEA报错 java: 错误: 不支持发行版本 5

    2023-04-17 10:54:25

    查看更多

    热门标签

    linux python Linux docker javascript spring kubernetes shell elasticsearch leetcode
    查看更多

    相关产品

    弹性云主机

    随时自助获取、弹性伸缩的云服务器资源

    天翼云电脑(公众版)

    便捷、安全、高效的云电脑服务

    对象存储

    高品质、低成本的云上存储服务

    云硬盘

    为云上计算资源提供持久性块存储

    查看更多

    随机文章

    IO流原理及流的分类

    java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter 增样将jar包导入

    HashMap与ConcurrentHashMap详细【大厂面试】

    解决org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back beca

    Maven中的dependencyManagement

    maven基本简介

    推荐助力领好礼 邀请好友完成推荐任务 最高可得千元电信卡
    查看详情
    • 7*24小时售后
    • 无忧退款
    • 免费备案
    • 专家服务
    售前咨询热线
    400-810-9889转1
    • 天翼云APP 微信公众号
    服务与支持
    • 备案中心
    • 售前咨询
    • 智能客服
    • 自助服务
    • 工单管理
    • 客户公告
    账户管理
    • 管理中心
    • 订单管理
    • 余额管理
    • 发票管理
    • 充值汇款
    • 续费管理
    快速入口
    • 文档中心
    • 最新活动
    • 免费试用
    • 安全专区
    • 信任中心
    • 天翼云学堂
    云网生态
    • 甄选商城
    • 渠道合作
    • 云市场合作
    了解天翼云
    • 关于天翼云
    • 天翼云APP
    • 服务案例
    • 新闻资讯
    • 联系我们
    • 校园招聘
    热门产品
    • 弹性云主机
    • 边缘安全加速平台
    • 天翼云电脑
    • 天翼云手机
    • 关系型数据库
    • 对象存储
    • 云硬盘
    • Web应用防火墙
    • 服务器安全卫士
    • 天翼云办公
    热门推荐
    • 云服务备份
    • 云空间
    • 全站加速
    • 安全加速
    • 云服务器
    • 云主机
    • 智能边缘云
    • 应用编排服务
    • 微服务引擎
    • 共享流量包
    更多推荐
    • web应用防火墙
    • 密钥管理
    • 等保咨询
    • 安全专区
    • 应用运维管理
    • 云日志服务
    • 云网融合
    • 云搜索服务
    • 数据湖探索
    • 数据仓库服务
    友情链接
    • 天翼云盘
    • 天翼企业云盘
    • 189邮箱
    • 中国电信集团
    ©2023 京ICP备 2021034386号
     
    推荐文章
    愤怒的消炎药  ·  Windows中的库编程(一、动态库介绍及如何导出全局函数) - zhaotianff - 博客园
    1 年前
    悲伤的麻辣香锅  ·  吓人,5秒钟偷走你的声音 - 掘金
    1 年前
    活泼的石榴  ·  正则表达式 – 运算符优先级 | 菜鸟教程
    2 年前
    深情的楼房  ·  big.js首页、文档和下载 - 小型快速 JavaScript 库 - OSCHINA - 中文开源技术交流社区
    2 年前
    文质彬彬的黑框眼镜  ·  czhko的个人空间-czhko个人主页-哔哩哔哩视频
    2 年前
    今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
    删除内容请联系邮箱 2879853325@qq.com
    Code - 代码工具平台
    © 2024 ~ 沪ICP备11025650号