package com.dsh.guns.core.support; import com.dsh.guns.core.support.exception.ToolBoxException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; /** * 类工具类 * 1、扫描指定包下的所有类
* 参考 http://www.oschina.net/code/snippet_234657_22722 * @author seaside_hi, xiaoleilu, chill * */ public class ClassKit { private ClassKit() { // 静态类不可实例化 } /** * 是否为标准的类
* 这个类必须:
* 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 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 newInstance(Class 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 newInstance(Class 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; } /** * 检查目标类是否可以从原类转化
* 转化包括:
* 1、原类是对象,目标类型是原类型实现的接口
* 2、目标类型是原类型的父类
* 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()); } }