自定义注解

自定义注解往往能够简化开发,当我们需要对某些类或者方法增加某些功能或者进行某些处理时,可以使用自定义注解做标注,减少代码侵入,实现低耦合。在自定义注解处理器中利用反射来完成想要的功能。

自定义注解一般需要根据实际使用定义一些成员变量(属性)。

 

注解解释:

 

自定义注解例子:

  需求:在导出功能中,对一些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;
    }
}
复制代码

 

posted @   杨岂  阅读(235)  评论(0编辑  收藏  举报
编辑推荐:
· .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数据
点击右上角即可分享
微信分享提示