阅读源码之路(二)

- 昨天看完了lang3包中的接口和类, 今天从AnnotationUtils, ClassUtils 开始读起
- 第一步     借助翻译软件看懂类的属性和方法是用来做什么的,  对整个工具类体系有个大概的印象
- 第二步     通读一个类, 记录优秀的代码.  第一个读的是ClassUtils类
- 第三步     做笔记. 复制ClassUtils类到新建包,  不好理解的加上注释,  方便下次翻看.  同时把比较优秀的代码摘抄下来.
- 第四步     总结
    - lang3      ClassUtils 类总结
    - 主要思想:      封装, 递归
    - 例: 
        //封装多个方法,实现代码的复用
         public static String getCanonicalName(final Object object) {
            return getCanonicalName(object, StringUtils.EMPTY);
         }
         
         public static String getCanonicalName(final Object object, final String valueIfNull) {
            if (object == null) {
                return valueIfNull;
            }
            final String canonicalName = object.getClass().getCanonicalName();
            return canonicalName == null ? valueIfNull : canonicalName;
        }


        
    - 终极版:
        public static String getShortCanonicalName(final String canonicalName) {
            return ClassUtils.getShortClassName(getCanonicalName(canonicalName));
        }


        
    - 递归:
         private static void getAllInterfaces(Class<?> cls, final HashSet<Class<?>> interfacesFound) {
             while (cls != null) {
                final Class<?>[] interfaces = cls.getInterfaces();
                for (final Class<?> i : interfaces) {
                     if (interfacesFound.add(i)) {
                         getAllInterfaces(i, interfacesFound);
                     }
                 }
                 cls = cls.getSuperclass();
             }
         }


         
     - 方法参数中嵌套三目运算符
         if (className.startsWith("L")) {
            className = className.substring(
                1,
                className.endsWith(";")
                    ? className.length() - 1
                    : className.length());
         }
         
     - 方法中参数设定为final
         if (className.endsWith("[]")) {
            final StringBuilder classNameBuffer = new StringBuilder();
            while (className.endsWith("[]")) {
            ...
     


     - 设置private的常量

         private static final Map<String, String> abbreviationMap;
         private static final 该变量只作用于当前类,被static静态方法调用。final表示该属性的值将不能被改变。 
         
- 把注释过的ClassUtils.java 保存到github中  




- 部分代码:
    //简便快捷的写法:  首先获取m.entrySet();然后增强for循环迭代出Entry<String, String>, 直接赋值给r
     final Map<String, String> r = new HashMap<>();
     for (final Map.Entry<String, String> e : m.entrySet()) {
         r.put(e.getValue(), e.getKey());
     }

    - 返回null值的方法:
     public static String getSimpleName(final Class<?> cls) { //cls可能为null
         return getSimpleName(cls, StringUtils.EMPTY);        //StringUtils.EMPTY: 在StringUtils中定义的常量 "";
     }
    
     public static String getSimpleName(final Class<?> cls, String valueIfNull) {  
         return cls == null ? valueIfNull : cls.getSimpleName();    //返回 "" 或类的简称
     }
    - 优点: 1. 代码复用  2.高大上^_^    对每一个方法都进行封装,实现代码的复用, 便于维护和阅读
    
     public static List<Class<?>> convertClassNamesToClasses(final List<String> classNames) {
        if (classNames == null) {
            return null;
        }
        final List<Class<?>> classes = new ArrayList<>(classNames.size());
        for (final String className : classNames) {
            try {
                classes.add(Class.forName(className));
            } catch (final Exception ex) { //final Exception ex; 定义一个ex,方法中只有这一个ex 代表异常 Exception
                classes.add(null);		 //把null值传入List,而不是抛出异常
            }
        }
        return classes;
     }

   - 一步到位
   e.g.     for (int i = 0; i < array.length; i++) {
                    classes[i] = array[i] == null ? null : array[i].getClass();
              }
         
   e.g.     return canonicalName == null ? valueIfNull : canonicalName;

猜你喜欢

转载自blog.csdn.net/secret_breathe/article/details/80287235