| package com.stylefeng.guns.core.support; | 
|   | 
|   | 
| import com.stylefeng.guns.core.support.exception.ToolBoxException; | 
|   | 
| import java.lang.reflect.Method; | 
| import java.lang.reflect.Modifier; | 
|   | 
| /** | 
|  * 类工具类 | 
|  * 1、扫描指定包下的所有类<br> | 
|  * 参考 http://www.oschina.net/code/snippet_234657_22722 | 
|  * @author seaside_hi, xiaoleilu, chill | 
|  * | 
|  */ | 
| public class ClassKit { | 
|      | 
|     private ClassKit() { | 
|         // 静态类不可实例化 | 
|     } | 
|      | 
|     /** | 
|      * 是否为标准的类<br> | 
|      * 这个类必须:<br> | 
|      * 1、非接口 2、非抽象类 3、非Enum枚举 4、非数组 5、非注解 6、非原始类型(int, long等) | 
|      *  | 
|      * @param clazz 类 | 
|      * @return 是否为标准类 | 
|      */ | 
|     public static boolean isNormalClass(Class<?> clazz) { | 
|         return null != clazz && false == clazz.isInterface() && false == isAbstract(clazz) && false == clazz.isEnum() && false == clazz.isArray() && false == clazz.isAnnotation() && false == clazz | 
|                 .isSynthetic() && false == clazz.isPrimitive(); | 
|     } | 
|      | 
|     /** | 
|      * 是否为抽象类 | 
|      *  | 
|      * @param clazz 类 | 
|      * @return 是否为抽象类 | 
|      */ | 
|     public static boolean isAbstract(Class<?> clazz) { | 
|         return Modifier.isAbstract(clazz.getModifiers()); | 
|     } | 
|      | 
|     /** | 
|      * 实例化对象 | 
|      *  | 
|      * @param clazz 类名 | 
|      * @return 对象 | 
|      */ | 
|     @SuppressWarnings("unchecked") | 
|     public static <T> T newInstance(String clazz) { | 
|         if (null == clazz) | 
|             return null; | 
|         try { | 
|             return (T) Class.forName(clazz).newInstance(); | 
|         } catch (Exception e) { | 
|             throw new ToolBoxException(StrKit.format("Instance class [{}] error!", clazz), e); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 实例化对象 | 
|      *  | 
|      * @param clazz 类 | 
|      * @return 对象 | 
|      */ | 
|     public static <T> T newInstance(Class<T> clazz) { | 
|         if (null == clazz) | 
|             return null; | 
|         try { | 
|             return (T) clazz.newInstance(); | 
|         } catch (Exception e) { | 
|             throw new ToolBoxException(StrKit.format("Instance class [{}] error!", clazz), e); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 实例化对象 | 
|      *  | 
|      * @param clazz 类 | 
|      * @return 对象 | 
|      */ | 
|     public static <T> T newInstance(Class<T> clazz, Object... params) { | 
|         if (null == clazz) | 
|             return null; | 
|         if (CollectionKit.isEmpty(params)) { | 
|             return newInstance(clazz); | 
|         } | 
|         try { | 
|             return clazz.getDeclaredConstructor(getClasses(params)).newInstance(params); | 
|         } catch (Exception e) { | 
|             throw new ToolBoxException(StrKit.format("Instance class [{}] error!", clazz), e); | 
|         } | 
|     } | 
|      | 
|     /** | 
|      * 获得对象数组的类数组 | 
|      * @param objects 对象数组 | 
|      * @return 类数组 | 
|      */ | 
|     public static Class<?>[] getClasses(Object... objects){ | 
|         Class<?>[] classes = new Class<?>[objects.length]; | 
|         for (int i = 0; i < objects.length; i++) { | 
|             classes[i] = objects[i].getClass(); | 
|         } | 
|         return classes; | 
|     } | 
|      | 
|     /** | 
|      * 检查目标类是否可以从原类转化<br> | 
|      * 转化包括:<br> | 
|      * 1、原类是对象,目标类型是原类型实现的接口<br> | 
|      * 2、目标类型是原类型的父类<br> | 
|      * 3、两者是原始类型或者包装类型(相互转换) | 
|      *  | 
|      * @param targetType 目标类型 | 
|      * @param sourceType 原类型 | 
|      * @return 是否可转化 | 
|      */ | 
|     public static boolean isAssignable(Class<?> targetType, Class<?> sourceType) { | 
|         if (null == targetType || null == sourceType) { | 
|             return false; | 
|         } | 
|   | 
|         // 对象类型 | 
|         if (targetType.isAssignableFrom(sourceType)) { | 
|             return true; | 
|         } | 
|   | 
|         // 基本类型 | 
|         if (targetType.isPrimitive()) { | 
|             // 原始类型 | 
|             Class<?> resolvedPrimitive = BasicType.wrapperPrimitiveMap.get(sourceType); | 
|             if (resolvedPrimitive != null && targetType.equals(resolvedPrimitive)) { | 
|                 return true; | 
|             } | 
|         } else { | 
|             // 包装类型 | 
|             Class<?> resolvedWrapper = BasicType.primitiveWrapperMap.get(sourceType); | 
|             if (resolvedWrapper != null && targetType.isAssignableFrom(resolvedWrapper)) { | 
|                 return true; | 
|             } | 
|         } | 
|         return false; | 
|     } | 
|      | 
|     /** | 
|      * 设置方法为可访问 | 
|      *  | 
|      * @param method 方法 | 
|      * @return 方法 | 
|      */ | 
|     public static Method setAccessible(Method method) { | 
|         if (null != method && ClassKit.isNotPublic(method)) { | 
|             method.setAccessible(true); | 
|         } | 
|         return method; | 
|     } | 
|      | 
|     /** | 
|      * 指定类是否为非public | 
|      *  | 
|      * @param clazz 类 | 
|      * @return 是否为非public | 
|      */ | 
|     public static boolean isNotPublic(Class<?> clazz) { | 
|         return false == isPublic(clazz); | 
|     } | 
|   | 
|     /** | 
|      * 指定方法是否为非public | 
|      *  | 
|      * @param method 方法 | 
|      * @return 是否为非public | 
|      */ | 
|     public static boolean isNotPublic(Method method) { | 
|         return false == isPublic(method); | 
|     } | 
|      | 
|     /** | 
|      * 指定类是否为Public | 
|      *  | 
|      * @param clazz 类 | 
|      * @return 是否为public | 
|      */ | 
|     public static boolean isPublic(Class<?> clazz) { | 
|         if (null == clazz) { | 
|             throw new NullPointerException("Class to provided is null."); | 
|         } | 
|         return Modifier.isPublic(clazz.getModifiers()); | 
|     } | 
|      | 
|     /** | 
|      * 指定方法是否为Public | 
|      *  | 
|      * @param method 方法 | 
|      * @return 是否为public | 
|      */ | 
|     public static boolean isPublic(Method method) { | 
|         if (null == method) { | 
|             throw new NullPointerException("Method to provided is null."); | 
|         } | 
|         return isPublic(method.getDeclaringClass()); | 
|     } | 
| } |