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());
|
}
|
}
|