自定义注解
自定义注解往往能够简化开发,当我们需要对某些类或者方法增加某些功能或者进行某些处理时,可以使用自定义注解做标注,减少代码侵入,实现低耦合。在自定义注解处理器中利用反射来完成想要的功能。
自定义注解一般需要根据实际使用定义一些成员变量(属性)。
注解解释:
自定义注解例子:
需求:在导出功能中,对一些POJO的一些字段的导出原来是写死的,如果需要增加导出某个字段或者减少导出某个字段,都需要在业务代码中进行字段的添加和删除,另外导出后字段的列表顺序也得手动修改。
使用自定义注解后,利用注解的两个属性title(导出的列在excel表中的列名)、sort(导出的列在excel中的顺序),将注解标注在需要导出的字段上并声明列名和顺序即可。变更顺序或者增加列名只需要修改注解
和在字段上标注注解即可。
自定义注解:
/** * 用在需要导出的实体类的属性字段上 * 〈功能详细描述〉 * * @author 17090889 * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) * @see "ExportFieldProcessor" */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Export { /** * 导出的列的列名,必填 * * @return */ String title(); /** * 导出的列在excel中的顺序,必填 * * @return */ int sort(); }
自定义注解处理器:
/** * 注解@Export的处理器,返回需要导出的列的集合 * * @author 17090889 * @Export 〈功能详细描述〉 * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ public class ExportFieldProcessor { /** * 解析指定的实体类的带有@Export注解的属性 * * @param clazz * @return */ public static Map resolveExportField(Class<?> clazz) { // 获取指定的class文件有哪些属性 Field[] fields = clazz.getDeclaredFields(); LinkedHashMap<String, String> fieldMap = new LinkedHashMap<>(); TreeMap<Integer, Map<String, String>> fieldTreeMap = new TreeMap<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1 - o2; } }); // 遍历这些属性,判断哪些属性有@Export注解 for (Field field : fields) { if (field.isAnnotationPresent(Export.class)) { Export export = field.getAnnotation(Export.class); String fieldName = field.getName(); String title = export.title(); int sort = export.sort(); Map<String, String> hashMap = new HashMap<>(Constants.TWO); hashMap.put(fieldName, title); fieldTreeMap.put(sort, hashMap); } } // 遍历排序好的filed map // Set<Map.Entry<Integer, Map<String, String>>> entrySet = fieldTreeMap.entrySet(); // for (Map.Entry<Integer, Map<String, String>> entry : entrySet) { // Map<String, String> map = entry.getValue(); // fieldMap.putAll(map); // } fieldTreeMap.forEach((key, value) -> fieldMap.putAll(value)); return fieldMap; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
2018-03-21 一个ajax请求,接收json数据