尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
把注解当“便利贴”——运行时自动识别字段
一、这次又遇到了什么麻烦每个订单对象有几十个字段程序员每次写导出代码都要手动列出“商品名对应A列、价格对应B列”太容易出错而且以后字段一改到处都要改。我们能不能在订单类的字段上直接写好“这是哪一列、什么标题”让程序自己去读这些配置这时候就该注解Annotation出场了。二、注解到底是什么你可以把注解理解成贴在代码上的便利贴。它对程序的运行逻辑没有直接影响但编译器、框架、或者我们自己写的工具可以去读这些“便利贴”上的信息然后决定怎么做。Java内置了三个最常用的便利贴我们项目里其实已经用了// 1. Override —— 告诉编译器“我真的是在重写你帮我检查一下方法签名对不对” Override public void export(ListOrder orders, String filePath) { ... } // 2. Deprecated —— 告诉调用者“这个方法过时了别用了” Deprecated public void oldExportMethod() { ... } // 3. SuppressWarnings —— 告诉编译器“我知道这里有问题别给我报警告了” SuppressWarnings(unchecked) public void someMethod() { ... }现在我们要自己定制一个便利贴让导出工具能读懂。三、第一步自定义一个注解 ExcelColumn这个注解就用来标记字段对应的Excel列标题。import java.lang.annotation.*; // Target 指定这个注解可以贴在哪些地方这里只贴在字段上 Target(ElementType.FIELD) // Retention 指定注解保留到什么时候RUNTIME 表示程序运行时还能通过反射读到它 Retention(RetentionPolicy.RUNTIME) public interface ExcelColumn { // 列标题默认值空字符串 String title() default ; // 列序号从0开始默认-1表示按字段顺序 int order() default -1; }Target决定便利贴能贴哪儿方法、字段、类等。Retention决定便利贴存活多久RUNTIME是存活到运行时这样我们才能用反射读。四、第二步把注解贴在订单类的字段上import java.math.BigDecimal; import java.util.Date; public class Order { ExcelColumn(title 订单编号, order 0) private String orderId; ExcelColumn(title 商品名称, order 1) private String productName; ExcelColumn(title 单价, order 2) private BigDecimal price; ExcelColumn(title 数量, order 3) private int quantity; ExcelColumn(title 下单时间, order 4) private Date createTime; // 有些字段不想导出干脆就不贴注解 private String internalNote; // 构造方法、getter/setter 略... }现在任何一个看这个类的人都能直接知道导出的列标题和顺序。五、第三步让导出器读注解自动生成Excel我们改造一下 ExcelOrderExporter让它利用反射读取注解信息不再需要硬编码列名。import java.lang.reflect.Field; import java.util.*; public class ExcelOrderExporter extends OrderExporter { Override public void export(ListOrder orders, String filePath) { // 1. 反射获取Order类的所有字段 Field[] fields Order.class.getDeclaredFields(); // 2. 找出所有贴了ExcelColumn的字段并按order排序 ListField excelFields new ArrayList(); for (Field field : fields) { if (field.isAnnotationPresent(ExcelColumn.class)) { excelFields.add(field); } } excelFields.sort(Comparator.comparingInt(f - { int o f.getAnnotation(ExcelColumn.class).order(); return o -1 ? Integer.MAX_VALUE : o; })); // 3. 模拟生成Excel真实项目用POI库 System.out.println(----- 导出Excel表头 -----); for (Field field : excelFields) { ExcelColumn col field.getAnnotation(ExcelColumn.class); System.out.print(col.title() \t); } System.out.println(); // 4. 遍历订单数据输出每一行 for (Order order : orders) { for (Field field : excelFields) { field.setAccessible(true); // 因为字段是private的 try { Object value field.get(order); System.out.print(value \t); } catch (IllegalAccessException e) { e.printStackTrace(); } } System.out.println(); } System.out.println(Excel已保存到: filePath); } }六、软件运行时实现了什么功能当用户点击“导出Excel”时程序会读取 Order 类上所有带了 ExcelColumn 的字段。按 order 排列顺序。用 title 做表头。自动提取每个订单对象中对应字段的值填入表格。效果哪天订单表多了个字段开发人员只要在那个字段上加一个注解导出的Excel就会自动多一列不用去修改导出器的核心代码。这就是“便利贴”带来的灵活性和低耦合。
RELATED

相关推荐

AI翻译模型能力天花板在哪?(27个真实翻车案例+128道分级测试题全公开)

AI翻译模型能力天花板在哪?(27个真实翻车案例+128道分级测试题全公开)

更多请点击: https://intelliparadigm.com 第一章:AI翻译模型能力天花板在哪? AI翻译模型的性能边界并非由单一指标定义,而是受制于语言学本质、训练数据质量、推理架构约束与跨文化语义对齐能力的多重制约。当前主流大语言模型驱…

📅 2026/8/22 20:24:14
WASM 在企业级应用中的落地:哪些场景已经成熟,哪些还在探索

WASM 在企业级应用中的落地:哪些场景已经成熟,哪些还在探索

WASM 在企业级应用中的落地:哪些场景已经成熟,哪些还在探索 一、一年前我在内部推广 WASM,被质疑了"为什么不用容器" 去年我在公司内部提了一个方案:用 WASM 替代 Docker 运行策略引擎的插件。技术主管在评审会上的第一…

📅 2026/8/22 20:24:14
AI自动化通知系统压测实录(QPS 12万+、送达率99.98%):金融级推送架构首次公开

AI自动化通知系统压测实录(QPS 12万+、送达率99.98%):金融级推送架构首次公开

更多请点击: https://kaifayun.com 第一章:AI自动化通知推送 AI自动化通知推送正成为现代运维与用户触达体系的核心能力。它通过融合自然语言处理、行为预测模型与多通道通信网关,实现从事件识别到精准送达的端到端闭环。相比传统规则引擎驱…

📅 2026/8/22 20:24:14
MORE NEWS

更多资讯

📰

电商运营三大隐性成本解析与管控策略

1. 项目概述:电商运营中的隐性成本洞察在电商行业摸爬滚打多年后,我发现一个有趣的现象:许多头部商家虽然GMV惊人,但实际利润率往往低于行业平均水平。去年执教SKA172期电商高阶运营课程时,通过对37家年销过亿店铺的财…

📰

Renovate Forgejo Tags 数据源全解析:从 Git 标签到自动化依赖更新

Renovate Forgejo Tags 数据源全解析:从 Git 标签到自动化依赖更新 【免费下载链接】renovate Home of the Renovate CLI: Cross-platform Dependency Automation by Mend.io 项目地址: https://gitcode.com/GitHub_Trending/re/renovate 本篇技术指南以 Ren…

📰

Ignite 的 ListItem 组件:构建可交互、可定制的列表行完整指南

Ignite 的 ListItem 组件:构建可交互、可定制的列表行完整指南 【免费下载链接】ignite Infinite Reds battle-tested React Native project boilerplate, along with a CLI, component/model generators, and more! 9 years of continuous development and countin…

📰

豆包大模型1280帧长视频理解:多模态融合实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

GEO技术如何提升品牌在AI搜索中的曝光

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

步进、闭环步进还是伺服?一张对比表搞定电机选型

做了这么多年非标自动化,被问得最多的问题之一就是:电机到底选步进、闭环步进还是伺服?几乎每个项目方案评审,都要把这个话题重新过一遍。问的人多了,我发现大家不是不清楚三者的名字,而是不清楚它们之间的…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬