Package org.miaixz.bus.core.xyz
Class ClassKit
java.lang.Object
org.miaixz.bus.core.xyz.ClassKit
类工具类
- Since:
- Java 17+
- Author:
- Kimi Liu
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic boolean指定类是否与给定的类名相同static Class<?> forName(String name, boolean isInitialized, ClassLoader loader) 加载指定名称的类,支持: 替换"/"为"." 自动查找内部类,如java.lang.Thread.State = java.lang.Thread$Statestatic Class<?> forName(String name, ClassLoader loader) 加载指定名称的类,支持: 替换"/"为"." 自动查找内部类,如java.lang.Thread.State = java.lang.Thread$Statestatic ClassLoader获取调用者的ClassLoaderstatic <T> Class<T> getClass(T obj) null安全的获取对象类型static Class<?>[]getClasses(Object... objects) 获得对象数组的类数组static ClassLoader获取ClassLoader,获取顺序如下: 获取调用者的ContextClassLoader 获取当前线程的ContextClassLoader 获取ClassKit对应的ClassLoader 获取系统ClassLoader(ClassLoader.getSystemClassLoader())static StringgetClassName(Class<?> clazz, boolean isSimple) 获取类名 类名并不包含“.class”这个扩展名 例如:ClassKit这个类static StringgetClassName(Object obj, boolean isSimple) 获取类名static String获得ClassPath,将编码后的中文路径解码为原字符 这个ClassPath路径会文件路径被标准化处理static StringgetClassPath(boolean isEncoded) 获得ClassPath,这个ClassPath路径会文件路径被标准化处理获得ClassPath,不解码路径中的特殊字符(例如空格和中文)getClassPathResources(boolean isDecode) 获得ClassPathgetClassPaths(String packageName) 获得ClassPath,不解码路径中的特殊字符(例如空格和中文)getClassPaths(String packageName, boolean isDecode) 获得ClassPathstatic ClassLoader获取当前线程的ClassLoaderstatic ObjectgetDefaultValue(Class<?> clazz) 获取指定类型分的默认值 默认值规则为:static Object[]getDefaultValues(Class<?>... classes) 获得默认值列表static Class<?> getEnclosingClass(Class<?> clazz) 获得外围类 返回定义此类或匿名类所在的类,如果类本身是在包中定义的,返回nullgetInterfaces(Class<?> cls) 获取指定类及其父类所有的实现接口。 结果顺序取决于查找顺序,当前类在前,父类的接口在后。static JarClassLoadergetJarClassLoader(File jarOrDir) 创建新的JarClassLoader,并使用此Classloader加载目录下的class文件和jar文件static URLgetLocation(Class<?> clazz) 获取class类路径URL, 不管是否在jar包中都会返回文件夹的路径 class在jar包中返回jar所在文件夹,class不在jar中返回文件夹目录 jdk中的类不能使用此方法static StringgetLocationPath(Class<?> clazz) 获取class类路径, 不管是否在jar包中都会返回文件夹的路径 class在jar包中返回jar所在文件夹,class不在jar中返回文件夹目录 jdk中的类不能使用此方法static StringgetPackage(Class<?> clazz) 获得给定类所在包的名称static StringgetPackageName(Class<?> clazz) 获取给定类的包的名称.static StringgetPackageName(String className) 获取给定类的包的名称.static StringgetPackagePath(Class<?> clazz) 获得给定类所在包的路径static ObjectgetPrimitiveDefaultValue(Class<?> clazz) 获取指定原始类型分的默认值 默认值规则为:static StringgetShortClassName(String className) 获取完整类名的短格式如: text.org.miaixz.core.StringKit - o.m.c.StringKitgetSuperClasses(Class<?> clazz) 获取指定类的所有父类,结果不包括指定类本身 如果无父类,返回一个空的列表static ClassLoader获取系统ClassLoaderstatic Class<?> getTypeArgument(Class<?> clazz) 获得给定类的第一个泛型参数static Class<?> getTypeArgument(Class<?> clazz, int index) 获得给定类的泛型参数static booleanisAllAssignableFrom(Class<?>[] types1, Class<?>[] types2) 比较判断types1和types2两组类,如果types1中所有的类都与types2对应位置的类相同,或者是其父类或接口,则返回truestatic booleanisAssignable(Class<?> targetType, Class<?> sourceType) 检查目标类是否可以从原类转化 转化包括: 1、原类是对象,目标类型是原类型实现的接口 2、目标类型是原类型的父类 3、两者是原始类型或者包装类型(相互转换)static booleanisBasicType(Class<?> clazz) 是否为基本类型(包括包装类和原始类)static boolean判断类是否为枚举类型static booleanisJdkClass(Class<?> clazz) 是否为JDK中定义的类或接口,判断依据:static booleanisNormalClass(Class<?> clazz) 是否为标准的类 这个类必须:static boolean指定类是否被提供,使用默认ClassLoader 通过调用loadClass(String, boolean, ClassLoader)方法尝试加载指定类名的类,如果加载失败返回false 加载失败的原因可能是此类不存在或其关联引用类不存在static booleanisPresent(String className, ClassLoader classLoader) 指定类是否被提供 通过调用loadClass(String, boolean, ClassLoader)方法尝试加载指定类名的类,如果加载失败返回false 加载失败的原因可能是此类不存在或其关联引用类不存在static booleanisPrimitiveWrapper(Class<?> clazz) 是否为包装类型static booleanisSerializable(Class<?> clazz) 给定类是否实现了序列化接口Serializablestatic booleanisSimpleTypeOrArray(Class<?> clazz) 是否为 简单值类型 或 简单值类型的数组static booleanisSimpleValueType(Class<?> clazz) 是否为简单值类型 包括:static booleanisTopLevelClass(Class<?> clazz) 是否为顶层类,即定义在包中的类,而非定义在类中的内部类static Class<?> 加载外部类static <T> Class<T> 加载类,通过传入类的字符串,返回其对应的类名,使用默认ClassLoader并初始化类(调用static模块内容和初始化static属性) 扩展Class.forName(String, boolean, ClassLoader)方法,支持以下几类类名的加载:static <T> Class<T> 加载类,通过传入类的字符串,返回其对应的类名,使用默认ClassLoader 扩展Class.forName(String, boolean, ClassLoader)方法,支持以下几类类名的加载:static <T> Class<T> loadClass(String name, boolean isInitialized, ClassLoader classLoader) 加载类,通过传入类的字符串,返回其对应的类名 此方法支持缓存,第一次被加载的类之后会读取缓存中的类 加载失败的原因可能是此类不存在或其关联引用类不存在 扩展Class.forName(String, boolean, ClassLoader)方法,支持以下几类类名的加载:static Class<?> primitiveToWrapper(Class<?> cls) 将指定的基元类对象转换为其对应的包装器类对象扫描该包路径下所有class文件scanPackage(String packageName) 扫描该包路径下所有class文件scanPackage(String packageName, Predicate<Class<?>> classFilter) 扫描包路径下满足class过滤器条件的所有class文件, 如果包路径为 com.abs + A.class 但是输入 abs会产生classNotFoundException 因为className 应该为 com.abs.A 现在却成为abs.A,此工具类对该异常进行忽略处理,有可能是一个不完善的地方,以后需要进行修改scanPackageByAnnotation(String packageName, Class<? extends Annotation> annotationClass) 扫描指定包路径下所有包含指定注解的类scanPackageBySuper(String packageName, Class<?> superClass) 扫描指定包路径下所有指定类或接口的子类或实现类static voidtraverseTypeHierarchy(Class<?> root, Predicate<Class<?>> filter, Consumer<Class<?>> consumer, boolean includeRoot) 按广度优先遍历包括root在内,其层级结构中的所有类和接口。 类遍历顺序如下: 离type距离越近,则顺序越靠前; 与type距离相同,则父类优先于接口; 与type距离相同的接口,则顺序遵循接口在Class.getInterfaces()的顺序;static voidtraverseTypeHierarchyWhile(Class<?> root, Predicate<Class<?>> terminator) 按广度优先遍历包括root在内,其层级结构中的所有类和接口,直到terminator返回falsestatic voidtraverseTypeHierarchyWhile(Class<?> root, Predicate<Class<?>> filter, Predicate<Class<?>> terminator) 按广度优先遍历包括root在内,其层级结构中的所有类和接口,直到terminator返回false
-
Constructor Details
-
ClassKit
public ClassKit()
-
-
Method Details
-
getClass
null安全的获取对象类型- Type Parameters:
T- 对象类型- Parameters:
obj- 对象,如果为null返回null- Returns:
- 对象类型,提供对象如果为
null返回null
-
getEnclosingClass
获得外围类 返回定义此类或匿名类所在的类,如果类本身是在包中定义的,返回null- Parameters:
clazz- 类- Returns:
- 外围类
-
getPackageName
获取给定类的包的名称. 类似java.lang.String字符串类- Parameters:
clazz- 类- Returns:
- 包名,如果类在默认包中定义,则为空字符串
-
getPackageName
获取给定类的包的名称. 类似java.lang.String字符串类.- Parameters:
className- 完整的类名- Returns:
- 包名,如果类在默认包中定义,则为空字符串
-
isTopLevelClass
是否为顶层类,即定义在包中的类,而非定义在类中的内部类- Parameters:
clazz- 类- Returns:
- 是否为顶层类
-
getClassName
获取类名- Parameters:
obj- 获取类名对象isSimple- 是否简单类名,如果为true,返回不带包名的类名- Returns:
- 类名
-
getClassName
获取类名 类名并不包含“.class”这个扩展名 例如:ClassKit这个类isSimple为false: "org.miaixz.bus.ClassKit" isSimple为true: "ClassKit"
- Parameters:
clazz- 类isSimple- 是否简单类名,如果为true,返回不带包名的类名- Returns:
- 类名
-
getShortClassName
获取完整类名的短格式如: text.org.miaixz.core.StringKit - o.m.c.StringKit- Parameters:
className- 类名- Returns:
- 短格式类名
-
getClasses
获得对象数组的类数组- Parameters:
objects- 对象数组,如果数组中存在null元素,则此元素被认为是Object类型- Returns:
- 类数组
-
equals
指定类是否与给定的类名相同- Parameters:
clazz- 类className- 类名,可以是全类名(包含包名),也可以是简单类名(不包含包名)ignoreCase- 是否忽略大小写- Returns:
- 指定类是否与给定的类名相同
-
scanPackageByAnnotation
public static Set<Class<?>> scanPackageByAnnotation(String packageName, Class<? extends Annotation> annotationClass) 扫描指定包路径下所有包含指定注解的类- Parameters:
packageName- 包路径annotationClass- 注解类- Returns:
- 类集合
- See Also:
-
scanPackageBySuper
扫描指定包路径下所有指定类或接口的子类或实现类- Parameters:
packageName- 包路径superClass- 父类或接口- Returns:
- 类集合
- See Also:
-
scanPackage
扫描该包路径下所有class文件- Returns:
- 类集合
- See Also:
-
scanPackage
扫描该包路径下所有class文件- Parameters:
packageName- 包路径 com | com. | com.abs | com.abs.- Returns:
- 类集合
- See Also:
-
scanPackage
扫描包路径下满足class过滤器条件的所有class文件, 如果包路径为 com.abs + A.class 但是输入 abs会产生classNotFoundException 因为className 应该为 com.abs.A 现在却成为abs.A,此工具类对该异常进行忽略处理,有可能是一个不完善的地方,以后需要进行修改- Parameters:
packageName- 包路径 com | com. | com.abs | com.abs.classFilter- class过滤器,过滤掉不需要的class- Returns:
- 类集合
-
getClassPathResources
获得ClassPath,不解码路径中的特殊字符(例如空格和中文)- Returns:
- ClassPath集合
-
getClassPathResources
获得ClassPath- Parameters:
isDecode- 是否解码路径中的特殊字符(例如空格和中文)- Returns:
- ClassPath集合
-
getClassPaths
获得ClassPath,不解码路径中的特殊字符(例如空格和中文)- Parameters:
packageName- 包名称- Returns:
- ClassPath路径字符串集合
-
getClassPaths
获得ClassPath- Parameters:
packageName- 包名称isDecode- 是否解码路径中的特殊字符(例如空格和中文)- Returns:
- ClassPath路径字符串集合
-
getClassPath
获得ClassPath,将编码后的中文路径解码为原字符 这个ClassPath路径会文件路径被标准化处理- Returns:
- ClassPath
-
getClassPath
获得ClassPath,这个ClassPath路径会文件路径被标准化处理- Parameters:
isEncoded- 是否编码路径中的中文- Returns:
- ClassPath
-
isAllAssignableFrom
比较判断types1和types2两组类,如果types1中所有的类都与types2对应位置的类相同,或者是其父类或接口,则返回true- Parameters:
types1- 类组1types2- 类组2- Returns:
- 是否相同、父类或接口
-
isPrimitiveWrapper
是否为包装类型- Parameters:
clazz- 类- Returns:
- 是否为包装类型
-
isBasicType
是否为基本类型(包括包装类和原始类)- Parameters:
clazz- 类- Returns:
- 是否为基本类型
-
isSimpleTypeOrArray
是否为 简单值类型 或 简单值类型的数组- Parameters:
clazz- 属性类- Returns:
- 是否为 简单值类型 或 简单值类型的数组
- See Also:
-
isSimpleValueType
是否为简单值类型 包括:原始类型 枚举 String、other CharSequence Number Date URI URL I18n Class jdk8时间相关类型- Parameters:
clazz- 类- Returns:
- 是否为简单值类型
-
isAssignable
检查目标类是否可以从原类转化 转化包括: 1、原类是对象,目标类型是原类型实现的接口 2、目标类型是原类型的父类 3、两者是原始类型或者包装类型(相互转换)- Parameters:
targetType- 目标类型sourceType- 原类型- Returns:
- 是否可转化
-
isSerializable
给定类是否实现了序列化接口Serializable- Parameters:
clazz- 类- Returns:
- 是否实现序列化接口
Serializable
-
isNormalClass
是否为标准的类 这个类必须:1、非接口 2、非抽象类 3、非Enum枚举 4、非数组 5、非注解 6、非原始类型(int, long等)
- Parameters:
clazz- 类- Returns:
- 是否为标准类
-
isEnum
判断类是否为枚举类型- Parameters:
clazz- 类- Returns:
- 是否为枚举类型
-
getTypeArgument
获得给定类的第一个泛型参数- Parameters:
clazz- 被检查的类,必须是已经确定泛型类型的类- Returns:
Class
-
getTypeArgument
获得给定类的泛型参数- Parameters:
clazz- 被检查的类,必须是已经确定泛型类型的类index- 泛型类型的索引号,即第几个泛型类型- Returns:
Class
-
getPackage
获得给定类所在包的名称- Parameters:
clazz- 类- Returns:
- 包名
-
getPackagePath
获得给定类所在包的路径- Parameters:
clazz- 类- Returns:
- 包名
-
getDefaultValue
获取指定类型分的默认值 默认值规则为:1、如果为原始类型,返回0 2、非原始类型返回
null- Parameters:
clazz- 类- Returns:
- 默认值
-
getPrimitiveDefaultValue
获取指定原始类型分的默认值 默认值规则为:1、如果为原始类型,返回0 2、非原始类型返回
null- Parameters:
clazz- 类- Returns:
- 默认值
-
getDefaultValues
获得默认值列表- Parameters:
classes- 值类型- Returns:
- 默认值列表
-
isJdkClass
是否为JDK中定义的类或接口,判断依据:1、以java.、javax.开头的包名 2、ClassLoader为null
- Parameters:
clazz- 被检查的类- Returns:
- 是否为JDK中定义的类或接口
-
getLocation
获取class类路径URL, 不管是否在jar包中都会返回文件夹的路径 class在jar包中返回jar所在文件夹,class不在jar中返回文件夹目录 jdk中的类不能使用此方法- Parameters:
clazz- 类- Returns:
- URL
-
getLocationPath
获取class类路径, 不管是否在jar包中都会返回文件夹的路径 class在jar包中返回jar所在文件夹,class不在jar中返回文件夹目录 jdk中的类不能使用此方法- Parameters:
clazz- 类- Returns:
- class路径
-
forName
加载指定名称的类,支持:- 替换"/"为"."
- 自动查找内部类,如java.lang.Thread.State = java.lang.Thread$State
- Parameters:
name- 类名loader-ClassLoader,null表示默认- Returns:
- 指定名称对应的类,如果不存在类,返回
null - See Also:
-
forName
加载指定名称的类,支持:- 替换"/"为"."
- 自动查找内部类,如java.lang.Thread.State = java.lang.Thread$State
- Parameters:
name- 类名isInitialized- 是否初始化loader-ClassLoader,null表示默认- Returns:
- 指定名称对应的类,如果不存在类,返回
null - See Also:
-
getSuperClasses
获取指定类的所有父类,结果不包括指定类本身 如果无父类,返回一个空的列表- Parameters:
clazz- 类, 可以为null- Returns:
- 指定类的所有父类列表,如果无父类,返回一个空的列表
-
getInterfaces
获取指定类及其父类所有的实现接口。 结果顺序取决于查找顺序,当前类在前,父类的接口在后。- Parameters:
cls- 被查找的类- Returns:
- 接口列表,若提供的查找类为
null,则返回空列表
-
traverseTypeHierarchyWhile
按广度优先遍历包括root在内,其层级结构中的所有类和接口,直到terminator返回false- Parameters:
root- 根类terminator- 对遍历到的每个类与接口执行的校验,若为false则立刻中断遍历
-
traverseTypeHierarchyWhile
public static void traverseTypeHierarchyWhile(Class<?> root, Predicate<Class<?>> filter, Predicate<Class<?>> terminator) 按广度优先遍历包括root在内,其层级结构中的所有类和接口,直到terminator返回false- Parameters:
root- 根类filter- 过滤器,被过滤的类及其层级结构中的类与接口将被忽略terminator- 对遍历到的每个类与接口执行的校验,若为false则立刻中断遍历
-
traverseTypeHierarchy
public static void traverseTypeHierarchy(Class<?> root, Predicate<Class<?>> filter, Consumer<Class<?>> consumer, boolean includeRoot) 按广度优先遍历包括root在内,其层级结构中的所有类和接口。 类遍历顺序如下:- 离
type距离越近,则顺序越靠前; - 与
type距离相同,则父类优先于接口; - 与
type距离相同的接口,则顺序遵循接口在Class.getInterfaces()的顺序;
- Parameters:
root- 根类filter- 过滤器,被过滤的类及其层级结构中的类与接口将被忽略consumer- 对遍历到的每个类与接口执行的操作,每个类和接口都只会被访问一次includeRoot- 是否包括根类
- 离
-
getClassLoader
获取ClassLoader,获取顺序如下:- 获取调用者的ContextClassLoader
- 获取当前线程的ContextClassLoader
- 获取ClassKit对应的ClassLoader
- 获取系统ClassLoader(
ClassLoader.getSystemClassLoader())
- Returns:
- 类加载器
-
getCallerClassLoader
获取调用者的ClassLoader- Returns:
ClassLoader
-
getContextClassLoader
获取当前线程的ClassLoader- Returns:
- 当前线程的class loader
- See Also:
-
getSystemClassLoader
获取系统ClassLoader- Returns:
- 系统
ClassLoader - See Also:
-
getJarClassLoader
创建新的JarClassLoader,并使用此Classloader加载目录下的class文件和jar文件- Parameters:
jarOrDir- jar文件或者包含jar和class文件的目录- Returns:
JarClassLoader
-
loadClass
加载类,通过传入类的字符串,返回其对应的类名,使用默认ClassLoader并初始化类(调用static模块内容和初始化static属性) 扩展Class.forName(String, boolean, ClassLoader)方法,支持以下几类类名的加载:1、原始类型,例如:int 2、数组类型,例如:int[]、Long[]、String[] 3、内部类,例如:java.lang.Thread.State会被转为java.lang.Thread$State加载
- Type Parameters:
T- 目标类的类型- Parameters:
name- 类名- Returns:
- 类名对应的类
- Throws:
InternalException- 包装ClassNotFoundException,没有类名对应的类时抛出此异常
-
loadClass
加载类,通过传入类的字符串,返回其对应的类名,使用默认ClassLoader 扩展Class.forName(String, boolean, ClassLoader)方法,支持以下几类类名的加载:1、原始类型,例如:int 2、数组类型,例如:int[]、Long[]、String[] 3、内部类,例如:java.lang.Thread.State会被转为java.lang.Thread$State加载
- Type Parameters:
T- 目标类的类型- Parameters:
name- 类名isInitialized- 是否初始化类(调用static模块内容和初始化static属性)- Returns:
- 类名对应的类
- Throws:
InternalException- 包装ClassNotFoundException,没有类名对应的类时抛出此异常
-
loadClass
public static <T> Class<T> loadClass(String name, boolean isInitialized, ClassLoader classLoader) throws InternalException 加载类,通过传入类的字符串,返回其对应的类名 此方法支持缓存,第一次被加载的类之后会读取缓存中的类 加载失败的原因可能是此类不存在或其关联引用类不存在 扩展Class.forName(String, boolean, ClassLoader)方法,支持以下几类类名的加载:1、原始类型,例如:int 2、数组类型,例如:int[]、Long[]、String[] 3、内部类,例如:java.lang.Thread.State会被转为java.lang.Thread$State加载
- Type Parameters:
T- 加载的类的类型- Parameters:
name- 类名isInitialized- 是否初始化类(调用static模块内容和初始化static属性)classLoader-ClassLoader,null则使用getClassLoader()获取- Returns:
- 类名对应的类
- Throws:
InternalException- 包装ClassNotFoundException,没有类名对应的类时抛出此异常
-
loadClass
加载外部类- Parameters:
jarOrDir- jar文件或者包含jar和class文件的目录name- 类名- Returns:
- 类
-
isPresent
指定类是否被提供,使用默认ClassLoader 通过调用loadClass(String, boolean, ClassLoader)方法尝试加载指定类名的类,如果加载失败返回false 加载失败的原因可能是此类不存在或其关联引用类不存在- Parameters:
className- 类名- Returns:
- 是否被提供
-
isPresent
指定类是否被提供 通过调用loadClass(String, boolean, ClassLoader)方法尝试加载指定类名的类,如果加载失败返回false 加载失败的原因可能是此类不存在或其关联引用类不存在- Parameters:
className- 类名classLoader-ClassLoader- Returns:
- 是否被提供
-
primitiveToWrapper
将指定的基元类对象转换为其对应的包装器类对象- Parameters:
cls- 要转换的类可以为null- Returns:
- 如果输入为
null,则返回cls, 否则返回cls的包装器类
-