All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.lulihu.ObjectKit.ClassKit Maven / Gradle / Ivy

package net.lulihu.ObjectKit;


import net.lulihu.Assert;
import net.lulihu.Assert0;
import net.lulihu.exception.ToolBoxException;

import java.lang.reflect.*;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 类工具类
 */
@SuppressWarnings("unchecked")
public class ClassKit {

    private ClassKit() {
        // 静态类不可实例化
    }

    /**
     * 缓存 空间换时间
     */
    private final static Map, Class[]> actualTypeArgument = new ConcurrentHashMap<>();

    /**
     * 获取泛型类Class对象,不是泛型类则返回null
     *
     * @param clazz 泛型类
     * @return 如果是泛型类返回泛型类,反之为null
     */
    public static Class[] getActualTypeArgument(Class clazz) {
        return actualTypeArgument.computeIfAbsent(clazz, k -> {
            Class[] resultClass = null;
            Type genericSuperclass = clazz.getGenericSuperclass();
            if (genericSuperclass instanceof ParameterizedType) {
                Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass).getActualTypeArguments();
                if (CollectionKit.isEmpty(actualTypeArguments)) {
                    int length = actualTypeArguments.length;

                    resultClass = new Class[length];
                    for (int i = 0; i < length; i++) {
                        resultClass[i] = (Class) actualTypeArguments[i];
                    }
                }
            }
            return resultClass;
        });
    }

    /**
     * 是否为标准的类
* 这个类必须:
* 1、非接口 2、非抽象类 3、非Enum枚举 4、非数组 5、非注解 6、非原始类型(int, long等) * * @param clazz 类 * @return 是否为标准类 */ public static boolean isNormalClass(Class clazz) { return null != clazz && !clazz.isInterface() && !isAbstract(clazz) && !clazz.isEnum() && !clazz.isArray() && !clazz.isAnnotation() && !clazz.isSynthetic() && !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("实例类 [{}] 错误!!", clazz), e); } } /** * 根据实例类型创建一个新的实例,优先使用无参构造函数,如果不存在无参构造函数则为第一个构造函数的参数设置默认值 * * @param clazz 实例类型 * @return 新的实例 */ public static T newInstanceConstructorsDefaultValue(Class clazz) { if (null == clazz) return null; // 优先使用无参构造函数 Constructor constructor = priorityNoArgumentConstructor(clazz); Class[] parameterTypes = constructor.getParameterTypes(); if (CollectionKit.isEmpty(parameterTypes)) return newInstance(clazz); int length = parameterTypes.length; Object[] args = new Object[length]; for (int i = 0; i < length; i++) { Class cla = parameterTypes[i]; if (BeanKit.isPrimitive(cla)) { args[i] = ObjectKit.primitiveDefaultValue(cla); } else { args[i] = null; } } try { return constructor.newInstance(args); } catch (Exception e) { throw new ToolBoxException(StrKit.format("实例类 [{}] 错误!", clazz), e); } } /** * 优先获取对象的无参构造函数如果不存在则返回第一个构造函数 * * @param clazz 对象类型 * @return 对象的构造函数 */ public static Constructor priorityNoArgumentConstructor(Class clazz) { Constructor[] constructors = clazz.getDeclaredConstructors(); for (Constructor constructor : constructors) { Class[] parameterTypes = constructor.getParameterTypes(); if (CollectionKit.isEmpty(parameterTypes)) { return constructor; } } return constructors[0]; } /** * 实例化对象 * * @param clazz 类 * @return 对象 */ public static T newInstance(Class clazz) { if (null == clazz) return null; try { return clazz.newInstance(); } catch (Exception e) { throw new ToolBoxException(StrKit.format("实例类 [{}] 错误!", 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("实例类 [{}] 发生例外!", 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); return targetType == resolvedPrimitive; } else { // 包装类型 Class resolvedWrapper = BasicType.primitiveWrapperMap.get(sourceType); return resolvedWrapper != null && targetType.isAssignableFrom(resolvedWrapper); } } /** * 设置方法为可访问 * * @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 !isPublic(clazz); } /** * 指定方法是否为非public * * @param method 方法 * @return 是否为非public */ public static boolean isNotPublic(Method method) { return !isPublic(method); } /** * 指定类是否为Public * * @param clazz 类 * @return 是否为public */ public static boolean isPublic(Class clazz) { Assert0.toolBox().notNull(clazz, "提供的类为null"); return Modifier.isPublic(clazz.getModifiers()); } /** * 指定方法是否为Public * * @param method 方法 * @return 是否为public */ public static boolean isPublic(Method method) { Assert0.toolBox().notNull(method, "提供的方法为null"); return isPublic(method.getDeclaringClass()); } /** * 获取对象的顶层父类(Object不算) * * @param obj 对象 * @return 超类 */ public static Class getSuperclass(Object obj) { return getSuperclass(obj.getClass()); } /** * 获取对象的顶层父类(Object不算) * * @param clazz 对象类型 * @return 超类 */ public static Class getSuperclass(Class clazz) { if (clazz == Object.class) return null; Class superclass = clazz.getSuperclass(); Class aClass = getSuperclass(superclass); if (aClass == null) return clazz; return getSuperclass(aClass); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy