Java可通过自定义注解(@DateFormat、@NumberFormat、@StringFormat)结合反射实现轻量数据格式化工具:标记字段规则,运行时读取注解并按类型策略格式化,支持嵌套与集合,生成格式化视图而非修改原对象。

Java 中可以通过自定义注解 + 反射,实现一个轻量、可扩展的数据格式化工具。核心思路是:用注解标记字段的格式化规则(比如日期模式、数字精度、字符串截断等),运行时通过反射读取注解信息,并对字段值做对应处理。
定义格式化注解
先设计几个常用注解,支持常见类型格式化:
-
@DateFormat:标注
java.util.Date或LocalDateTime字段,指定pattern(如"yyyy-MM-dd HH:mm:ss") -
@NumberFormat:标注数值字段,支持
pattern(如"#,##0.00")或scale(保留小数位数) -
@StringFormat:标注字符串字段,支持
maxLen(截断长度)、prefix/suffix - 所有注解都设为
@Retention(RetentionPolicy.RUNTIME)和@Target(ElementType.FIELD),确保反射可读
编写格式化处理器
创建一个通用工具类(如 Formatter),提供静态方法 format(Object obj):
- 遍历对象所有
Field,跳过 static/final 字段 - 检查字段是否带有上述任一注解,获取注解实例
- 根据字段类型和注解类型选择格式化策略:
•Date/LocalDateTime→ 用DateTimeFormatter或SimpleDateFormat格式化
•Number子类 → 用DecimalFormat或BigDecimal.setScale()
•String→ 截取、拼接前缀/后缀 - 使用
Field.setAccessible(true)访问私有字段,读取原始值并写入格式化后的字符串(可存入新 Map,或生成新 DTO 对象)
支持嵌套对象与集合
基础版本只处理当前类字段,进阶可递归支持:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 遇到字段类型是自定义 POJO 类,递归调用
format() - 遇到
List/Set,遍历每个元素,对每个元素调用格式化(需判断泛型实际类型) - 可加
@SkipFormat注解跳过某些字段,避免无限递归或敏感字段被格式化
使用示例与注意事项
定义一个测试类:
<font size="2"><pre class="brush:php;toolbar:false;">public class User {
@DateFormat(pattern = "yyyy/MM/dd")
private Date birthday;
@NumberFormat(scale = 2)
private BigDecimal salary;
@StringFormat(maxLen = 10, prefix = "[")
private String name;
}
调用 Formatter.format(new User()) 后返回一个 Map<String, String>,键为字段名,值为格式化后的字符串(如 {"birthday": "2024/05/20", "salary": "15000.00", "name": "[zhangsan"})。
注意点:
• 注解不改变原对象,只生成格式化视图,适合日志、API 响应等场景
• 反射性能较低,建议配合 Field 缓存(如用 ConcurrentHashMap<Class, List<FieldInfo>>)
• 处理 null 值必须判空,避免 NullPointerException

















