Java經常使用工具類

`集合操做工具類: 1.判斷是否爲空:isEmpty() 2.判斷是否非空:isNotEmpty() 代碼: import org.apache.commons.collections.CollectionUtils; import java.util.Collection; public class CollectionUtil { /** * 判斷集合是否非空 */ public static boolean isNotEmpty(Collection<?> collection) { return CollectionUtils.isNotEmpty(collection); }java

/**
               * 判斷集合是否爲空
               */
              public static boolean isEmpty(Collection<?> collection) {
                  return CollectionUtils.isEmpty(collection);
              }
          }

類加載器工具類: 1.獲取類加載器:Thread.currentThread().getContextClassLoader() 2.獲取類路徑: getClassPath() 3.加載類文件 4.異常處理 5.判斷類型 代碼: import java.net.URL; public class ClassUtil { /** * 獲取類加載器: Thread.currentThread().getContextClassLoader() */ public static ClassLoader getClassLoader() { return Thread.currentThread().getContextClassLoader(); }redis

/**
             * 獲取類路徑
             */
            public static String getClassPath() {
                String classpath = "";
                URL resource = getClassLoader().getResource("");
                if (resource != null) {
                    classpath = resource.getPath();
                }
                return classpath;
            }

            /**
             * 加載類(將自動初始化)
             */
            public static Class<?> loadClass(String className) {
                return loadClass(className, true);
            }

            /**
             * 加載類
             */
            public static Class<?> loadClass(String className, boolean isInitialized) {
                try {
                    return Class.forName(className, isInitialized, getClassLoader());
                } catch (ClassNotFoundException e) {
                    throw new RuntimeException("加載類出錯:" + e.getMessage(), e);
                }
            }

            /**
             * 是否爲 int 類型(包括 Integer 類型)
             */
            public static boolean isInt(Class<?> type) {
                return type.equals(int.class) || type.equals(Integer.class);
            }

            /**
             * 是否爲 long 類型(包括 Long 類型)
             */
            public static boolean isLong(Class<?> type) {
                return type.equals(long.class) || type.equals(Long.class);
            }

            /**
             * 是否爲 double 類型(包括 Double 類型)
             */
            public static boolean isDouble(Class<?> type) {
                return type.equals(double.class) || type.equals(Double.class);
            }

            /**
             * 是否爲 String 類型
             */
            public static boolean isString(Class<?> type) {
                return type.equals(String.class);
            }

加載幫助類工具類: 1.編寫相應的方法 2.綁定類標識 3.初始化[定義相關的幫助類和實現加載幫助類] 代碼: //導入相關Jar import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class HelperLoader { private static final Logger logger = LoggerFactory.getLogger(HelperLoader.class); public static final boolean IS_SERVLET25; static { boolean b; try { Class.forName("包名.類名$標識名"); b = false; } catch(Throwable t) { b = true; } IS_SERVLET25 = b; logger.info("[fw] servlet25 " + IS_SERVLET25); } //存在這個類 private static class 標識名 {} public static void init() { // 定義須要加載的 Helper 類 Class<?>[] classList = { DataSourceHolder.class, //初始化ds JedisHolder.class, //初始化redis EntityHelper.class, ActionHelper.class, BeanHelper.class, AopHelper.class, IocHelper.class, PluginHelper.class, }; // 按照順序加載類 for (Class<?> cls : classList) { ClassUtil.loadClass(cls.getName()); } } }apache

加載AOP框架工具類: 1.獲取ClassScanner[類掃描器] 2.編寫相關的代理 3.添加相關的代理 代碼: //導入相關的jar import java.lang.annotation.Annotation; import java.util.*; public class AopHelper {框架

/**
          * 獲取 ClassScanner
          */
         private static final ClassScanner classScanner = InstanceFactory.getClassScanner();

         static {
             try {
                 // 建立 Proxy Map(用於 存放代理類 與 目標類列表 的映射關係)
                 Map<Class<?>, List<Class<?>>> proxyMap = createProxyMap();
                 // 建立 Target Map(用於 存放目標類 與 代理類列表 的映射關係)
                 Map<Class<?>, List<Proxy>> targetMap = createTargetMap(proxyMap);
                 // 遍歷 Target Map
                 for (Map.Entry<Class<?>, List<Proxy>> targetEntry : targetMap.entrySet()) {
                     // 分別獲取 map 中的 key 與 value
                     Class<?> targetClass = targetEntry.getKey();
                     List<Proxy> proxyList = targetEntry.getValue();
                     // 建立代理實例
                     Object proxyInstance = ProxyManager.createProxy(targetClass, proxyList);
                     // 用代理實例覆蓋目標實例,並放入 Bean 容器中
                     BeanHelper.setBean(targetClass, proxyInstance);
                 }
             } catch (Exception e) {
                 throw new InitializationError("初始化 AopHelper 出錯!", e);
             }
         }

         private static Map<Class<?>, List<Class<?>>> createProxyMap() throws Exception {
             Map<Class<?>, List<Class<?>>> proxyMap = new LinkedHashMap<Class<?>, List<Class<?>>>();
             // 添加相關代理
             addPluginProxy(proxyMap);      // 插件代理
             addAspectProxy(proxyMap);      // 切面代理
             addTransactionProxy(proxyMap); // 事務代理
             return proxyMap;
         }

         private static void addPluginProxy(Map<Class<?>, List<Class<?>>> proxyMap) throws Exception {
             // 獲取插件包名下父類爲 PluginProxy 的全部類(插件代理類)
             List<Class<?>> pluginProxyClassList = classScanner.getClassListBySuper(FrameworkConstant.PLUGIN_PACKAGE, PluginProxy.class);
             if (CollectionUtil.isNotEmpty(pluginProxyClassList)) {
                 // 遍歷全部插件代理類
                 for (Class<?> pluginProxyClass : pluginProxyClassList) {
                     // 建立插件代理類實例
                     PluginProxy pluginProxy = (PluginProxy) pluginProxyClass.newInstance();
                     // 將插件代理類及其所對應的目標類列表放入 Proxy Map 中
                     proxyMap.put(pluginProxyClass, pluginProxy.getTargetClassList());
                 }
             }
         }

         private static void addAspectProxy(Map<Class<?>, List<Class<?>>> proxyMap) throws Exception {
             // 獲取切面類(全部繼承於 BaseAspect 的類)
             List<Class<?>> aspectProxyClassList = ClassHelper.getClassListBySuper(AspectProxy.class);
             // 添加插件包下全部的切面類
             aspectProxyClassList.addAll(classScanner.getClassListBySuper(FrameworkConstant.PLUGIN_PACKAGE, AspectProxy.class));
             // 排序切面類
             sortAspectProxyClassList(aspectProxyClassList);
             // 遍歷切面類
             for (Class<?> aspectProxyClass : aspectProxyClassList) {
                 // 判斷 Aspect 註解是否存在
                 if (aspectProxyClass.isAnnotationPresent(Aspect.class)) {
                     // 獲取 Aspect 註解
                     Aspect aspect = aspectProxyClass.getAnnotation(Aspect.class);
                     // 建立目標類列表
                     List<Class<?>> targetClassList = createTargetClassList(aspect);
                     // 初始化 Proxy Map
                     proxyMap.put(aspectProxyClass, targetClassList);
                 }
             }
         }

         private static void addTransactionProxy(Map<Class<?>, List<Class<?>>> proxyMap) {
             // 使用 TransactionProxy 代理全部 Service 類
             List<Class<?>> serviceClassList = ClassHelper.getClassListByAnnotation(Service.class);
             proxyMap.put(TransactionProxy.class, serviceClassList);
         }

         private static void sortAspectProxyClassList(List<Class<?>> proxyClassList) {
             // 排序代理類列表
             Collections.sort(proxyClassList, new Comparator<Class<?>>() {
                 @Override
                 public int compare(Class<?> aspect1, Class<?> aspect2) {
                     if (aspect1.isAnnotationPresent(AspectOrder.class) || aspect2.isAnnotationPresent(AspectOrder.class)) {
                         // 如有 Order 註解,則優先比較(序號的值越小越靠前)
                         if (aspect1.isAnnotationPresent(AspectOrder.class)) {
                             return getOrderValue(aspect1) - getOrderValue(aspect2);
                         } else {
                             return getOrderValue(aspect2) - getOrderValue(aspect1);
                         }
                     } else {
                         // 若無 Order 註解,則比較類名(按字母順序升序排列)
                         return aspect1.hashCode() - aspect2.hashCode();
                     }
                 }

                 private int getOrderValue(Class<?> aspect) {
                     return aspect.getAnnotation(AspectOrder.class) != null ? aspect.getAnnotation(AspectOrder.class).value() : 0;
                 }
             });
         }

         private static List<Class<?>> createTargetClassList(Aspect aspect) throws Exception {
             List<Class<?>> targetClassList = new ArrayList<Class<?>>();
             // 獲取 Aspect 註解的相關屬性
             String pkg = aspect.pkg();
             String cls = aspect.cls();
             Class<? extends Annotation> annotation = aspect.annotation();
             // 若包名不爲空,則需進一步判斷類名是否爲空
             if (StringUtil.isNotEmpty(pkg)) {
                 if (StringUtil.isNotEmpty(cls)) {
                     // 若類名不爲空,則僅添加該類
                     targetClassList.add(ClassUtil.loadClass(pkg + "." + cls, false));
                 } else {
                     // 若註解不爲空且不是 Aspect 註解,則添加指定包名下帶有該註解的全部類
                     if (annotation != null && !annotation.equals(Aspect.class)) {
                         targetClassList.addAll(classScanner.getClassListByAnnotation(pkg, annotation));
                     } else {
                         // 不然添加該包名下全部類
                         targetClassList.addAll(classScanner.getClassList(pkg));
                     }
                 }
             } else {
                 // 若註解不爲空且不是 Aspect 註解,則添加應用包名下帶有該註解的全部類
                 if (annotation != null && !annotation.equals(Aspect.class)) {
                     targetClassList.addAll(ClassHelper.getClassListByAnnotation(annotation));
                 }
             }
             return targetClassList;
         }

         private static Map<Class<?>, List<Proxy>> createTargetMap(Map<Class<?>, List<Class<?>>> proxyMap) throws Exception {
             Map<Class<?>, List<Proxy>> targetMap = new HashMap<Class<?>, List<Proxy>>();
             // 遍歷 Proxy Map
             for (Map.Entry<Class<?>, List<Class<?>>> proxyEntry : proxyMap.entrySet()) {
                 // 分別獲取 map 中的 key 與 value
                 Class<?> proxyClass = proxyEntry.getKey();
                 List<Class<?>> targetClassList = proxyEntry.getValue();
                 // 遍歷目標類列表
                 for (Class<?> targetClass : targetClassList) {
                     // 建立代理類(切面類)實例
                     Proxy baseAspect = (Proxy) proxyClass.newInstance();
                     // 初始化 Target Map
                     if (targetMap.containsKey(targetClass)) {
                         targetMap.get(targetClass).add(baseAspect);
                     } else {
                         List<Proxy> baseAspectList = new ArrayList<Proxy>();
                         baseAspectList.add(baseAspect);
                         targetMap.put(targetClass, baseAspectList);
                     }
                 }
             }
             return targetMap;
         }
     }
                 }`
相關文章
相關標籤/搜索