zoukankan      html  css  js  c++  java
  • 自定义注解

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

    注解解释:

    自定义注解例子:

      需求:在导出功能中,对一些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;
        }
    }
  • 相关阅读:
    vue项目目录
    vue 组件传值,(太久不用就会忘记,留在博客里,方便自己查看)
    vuex学习心得
    vue2+webpack怎样分环境打包
    我的笔记啦
    如何在vue2.0项目中引用element-ui和echart.js
    Exsi SSH 服务配置
    CentOS 6 通过DVD快速建立本地YUM源
    为SSO 5.5恢复忘记的administrator@vsphere.local密码
    sshfs 通过ssh 挂载远程目录
  • 原文地址:https://www.cnblogs.com/yangyongjie/p/10570511.html
Copyright © 2011-2022 走看看