本章节主要介绍 ReflectUtil、ClassUtil等工具类的使用,涵盖对象、类、类加载、类的类型判断、反射等操作,涉及到的工具类如下:
这里简单介绍一下常用几种类别:
ClassLoaderUtil:类加载工具类
ClassLoader 工具类主要完成对类的加载
具体传参与返回值可查看接口文档,这里仅总览出常用的可完成的功能方法
方法 | 功能 | 原理 |
---|
getContextClassLoader | 获取当前线程的 ClassLoader | Thread.currentThread().getContextClassLoader() |
getSystemClassLoader | 获取系统 ClassLoader | ClassLoader.getSystemClassLoader() |
getClassLoader | 获取 ClassLoader,获取顺序如下: 获取当前线程的ContextClassLoader 获取当前类对应的ClassLoader 获取系统ClassLoader | |
loadClass | 通过传入类的字符串加载类: 使用加载器ClassLoader(默认采用getClassLoader获取到的)加载,并初始化类(默认进行初始化,可指定是否初始化) | Class.forName() / Array.newInstance |
loadPrimitiveClass | 通过传入类的字符串加载原始类型的类 包括原始类型、原始类型数组和void | |
getJarClassLoader | 创建新的 JarClassLoader,并使用此Classloader加载目录下的class文件和jar文件 | |
isPresent | 指定类是否被提供,通过loadClass 来加载,若加载到即为提供 | |
ClassUtil:类相关工具类
其里面主要针对类的一些功能进行实现
具体传参与返回值可查看接口文档,这里仅总览出常用的可完成的功能方法
方法 | 功能 | 支持类型 | 原理 |
---|
getClasses getClass | 安全的获取对象类型 获得对象数组的类数组 | T / Object | obj.getClass() |
getClassName getShortClassName | 获取类名,类名并不包含“.class”这个扩展名,可选择返回不带包名的类名 获取完整类名的短格式,如 cn.hutool.core.util.StrUtil -》c.h.c.u.StrUtil | Object | clazz.getEnclosingClass |
getEnclosingClass isTopLevelClass | 是否为顶层类,即定义在包中的类,而非定义在类中的内部类 返回定义此类或匿名类所在的类,如果类本身是在包中定义的,返回 null | Class | |
scanPackageByAnnotation scanPackageBySuper scanPackage | 扫描指定包路径下所有包含指定注解的类 扫描指定包路径下所有指定类或接口的子类或实现类 扫描该包路径下所有class文件 | | clazz.isAnnotationPresent |
getPublicMethodNames getPublicMethods | 获得指定类中的Public方法名 获得本类及其父类所有Public方法 / 过滤后的Public方法列表 | Class | clazz.getMethods |
getDeclaredMethodNames getDeclaredMethods | 获得声明的所有方法,包括本类及其父类和接口的所有方法和Object类的方法名称 获得声明的所有方法,包括本类及其父类和接口的所有方法和Object类的方法 | Class | clazz.getDeclaredMethods |
getClassPathResources getClassPaths getClassPathURL getJavaClassPaths | 获得ClassPath,默认不解码路径中的特殊字符(例如空格和中文) 获得ClassPath,默认不解码路径中的特殊字符(例如空格和中文) 获得ClassPath URL 获得Java ClassPath路径 | Class | clazz.getResource |
getResources getResourceURL getResourceUrl | 获取指定路径下的资源列表 获得资源相对路径对应的URL 获得资源相对路径对应的URL | | clazz.getResource |
getContextClassLoader getClassLoader loadClass | 获取当前线程的ClassLoader 获取 ClassLoader 加载类并初始化(默认进行初始化,可设置不进行初始化) | | Thread.currentThread().getContextClassLoader() Class.forName() / Array.newInstance |
invoke | 执行方法 | | method.invoke |
isSimpleValueType isAssignable isPrimitiveWrapper isSimpleTypeOrArray isBasicType isPublic isNotPublic isAbstract isNormalClass isEnum | 是否为简单值类型 检查目标类是否可以从原类转化 类是否为包装类型 是否简单值类型或简单值类型的数组 类是否为简单类型 指定类是否为Public 指定类是否为非public 指定类是否为抽象类 指定类是否为标准的类 指定类是否为枚举类型 | Class | clazz.isXXX |
isStatic setAccessible | 方法是否为静态方法 方法是否设置为可访问 | Method | |
getTypeArgument getPackage getPackagePath getDefaultValue getDefaultValues getPrimitiveDefaultValue getLocation、getLocationPath isJdkClass | 获得给定类的第一个泛型参数 获得给定类所在包的名称 获得给定类所在包的路径 获取指定类型分的默认值(原始类型为0,其他为null) 获取指定类型分的默认值(数组) 获取指定原始类型分的默认值 获取class类路径URL / String path 是否为JDK中定义的类或接口(以java.、javax.开头的包名 或者 ClassLoader为null的类/接口为JDK中定义的类/接口) | Class | |
ObjectUtil:对象相关工具类
其里面主要针对对象Object的一些功能进行实现
具体传参与返回值可查看接口文档,这里仅总览出常用的可完成的功能方法
方法 | 功能 | 支持类型 | 原理 |
---|
equals、equal notEqual | 比较两个对象是否相等 比较两个对象是否不相等 | Object | Objects.equals |
isNull isNotNull isEmpty isNotEmpty isAllEmpty、isAllNotEmpty | 检查对象是否为null 检查对象是否不为null 判断指定对象是否为空 判断指定对象是否不为空 所有对象是否全都为空 / 不为空 | Object | Objects.equals 长度 / size 是否为0 |
defaultIfNull defaultIfEmpty defaultIfBlank | 如果给定对象为 null 返回默认值 如果给定对象为 null 或者 “” 返回默认值 | T | |
clone cloneIfPossible cloneByStream | 克隆对象,如果对象实现Cloneable接口,调用其clone方法,如果实现Serializable接口,执行深度克隆,否则返回 null 返回克隆后的对象,如果克隆失败,返回原对象 序列化后拷贝流的方式克隆(必须实现Serializable接口) | T | 反射执行 clone 方法 ValidateObjectInputStream .readObject() |
length contains hasNull hasEmpty emptyCount | 计算对象长度 对象中是否包含指定元素 多个对象中是否存在 null 对象 多个对象是否存在 null 或 空对象 多个对象存在多少个 null 或 空对象 | Object | |
serialize deserialize | 序列化 与 反序列化(必须实现Serializable接口) | T / byte[] | io操作 |
isBasicType isValidIfNumber | 对象是否为基本类型,包括包装类型和非包装类型 对象是否为有效的数字 | Object | clazz.isPrimitive() |
toString | 将Object转为String | Object | obj.toString() |
compare | 安全的对象比较 | T | compareTo |
getTypeArgument | 获得给定类的第一个泛型参数 | Object | |
TypeUtil:类的类型相关工具类
其里面主要针对 Type 的一些功能进行封装
具体传参与返回值可查看接口文档,这里仅总览出常用的可完成的功能方法
方法 | 功能 | 支持类型 | 原理 |
---|
getClass | 获得原始类 | Type / Field | |
getType getFieldType | 获取字段Field对应的Type类型 根据字段名称获得字段的泛型类型 | Object | |
getFirstParamType getFirstParamClass getParamType getParamClass getParamTypes getParamClasses getReturnType getReturnClass | 获取方法的第一个参数类型 获取方法的第一个参数类 获取方法指定位置的参数类型 获取方法指定位置的参数类 获取方法的参数类型列表 获取方法的参数类列表 获取方法的返回值类型 获取方法的返回值类 | Method | method.getxxxx() |
toParameterizedType | 将 Type 转换为ParameterizedType,一般用于获取泛型参数具体的参数类型 | Type | |
getTypeArgument | 获得给定类的第一个泛型参数 | Type | |
getActualType getActualTypes | 获得泛型字段对应的泛型实际类型,如果此变量没有对应的实际类型,返回null 获得泛型变量对应的泛型实际类型数组 | Type | |
getTypeMap | 获取泛型变量和泛型实际类型的对应关系Map | Class | |
hasTypeVariable | 指定泛型数组中是否含有泛型变量 | Type… | obj.toString() |
isUnknown | 指定类型是否是未知类型(type为null或者 TypeVariable 都视为未知类型) | Type | |
ReflectUtil:反射相关工具类
其里面主要针对 反射的一些功能进行封装
具体传参与返回值可查看接口文档,这里仅总览出常用的可完成的功能方法
方法 | 功能 | 支持类型 | 原理 |
---|
getConstructor、getConstructors getConstructorsDirectly | 查找类中的指定参数的构造方法,如果找到构造方法,会自动设置可访问为true 获得一个类中所有构造列表,直接反射获取,无缓存 | Class | clazz.getDeclaredConstructors() |
hasField getFieldName getField getFieldMap getFields getFieldsDirectly getFieldValue getFieldsValue getStaticFieldValue setFieldValue | 找指定类中是否包含指定名称对应的字段,包括所有字段(包括非public字段),也包括父类和Object类的字段 获取字段名 查找指定类中的指定name的字段(包括非public字段),也包括父类和Object类的字段, 字段不存在则返回 null 获取指定类中字段名和字段对应的有序Map,包括其父类中的字段 获得一个类中所有字段列表,包括其父类中的字段 获得一个类中所有字段列表,直接反射获取,无缓存 获取字段值 获取所有字段的值 获取静态字段值 设置字段值 | Class | clazz.getDeclaredFields() |
getPublicMethodNames getPublicMethods getPublicMethod getMethodOfObj getMethodIgnoreCase getMethod getMethodByName getMethodByNameIgnoreCase getMethodNames getMethods getMethodsDirectly | 获得指定类本类及其父类中的Public方法名(去除重载的方法) 获得本类及其父类所有Public方法 根据方法名称查找指定Public方法 如果找不到对应的方法或方法不为public的则返回 根据方法名称查找指定对象中的所有方法(包括非public方法),也包括父对象和Object类的方法型 根据方法名称查找指定方法(忽略大小写),如果找不到对应的方法则返回null 根据方法名称查找指定方法 如果找不到对应的方法则返回null 根据方法名称查找指定方法(忽略大小写),如果找不到对应的方法则返回null(忽略方法的参数) 获得指定类中的Public方法名 获得指定类过滤后的Public方法列表 获得一个类中所有方法列表,直接反射获取,无缓存 | Class | clazz.getMethods() |
isOuterClassField | 字段是否为父类引用字段(字段所在类是对象子类时(对象中定义的非static的class),会自动生成一个以"this$0"为名称的字段,指向父类对象) | Type | equals |
isEqualsMethod isHashCodeMethod isToStringMethod isEmptyParam isGetterOrSetterIgnoreCase isGetterOrSetter | 方法是否为equals方法 、hashCode 方法 、 toString 方法、空参方法、get/set方法 | Method | equals |
newInstance newInstance newInstanceIfPossible | 实例化对象 | String Class | Class.forName Constructor.newInstance() |
invokeStatic invokeWithCheck invoke invoke | 执行方法 | Method | method.invoke |
setAccessible | 设置方法为可访问(私有方法可以被外部调用) | Class、Method、Field | AccessibleObject.setAccessible(true) |
ReferenceUtil: 引用相关工具类
其里面主要针对 类引用 的一些功能进行封装,一般引用会分为三种:
SoftReference:软引用,在GC报告内存不足时会被GC回收
WeakReference: 弱引用,在GC时发现弱引用会回收其对象
PhantomReference:虚引用,在GC时发现虚引用对象,会将加入队列,此时对象未被真正回收,要等到队列被真正处理后才会被回收
其中只有一个 create 方法来创建引用
SerializeUtil:类序列化工具类
其里面主要针对 类序列化 的一些功能进行封装
具体传参与返回值可查看接口文档,这里仅总览出常用的可完成的功能方法
方法 | 功能 | 支持类型 | 原理 |
---|
clone | 序列化后拷贝流的方式克隆 | Type / Field | deserialize(serialize(obj)) |
serialize | 序列化 对象必须实现Serializable接口 | T | io操作 |
deserialize | 反序列化 对象必须实现Serializable接口 | byte[] | io操作 |
ModifierUtil:类修饰符相关工具类
其里面主要针对 类修饰符 的一些功能进行封装
具体传参与返回值可查看接口文档,这里仅总览出常用的可完成的功能方法
方法 | 功能 | 支持类型 | 原理 |
---|
isPublic isStatic isAbstract isSynthetic | 是否是Public方法 / 类/ 字段 是否是Static方法 / 类/ 字段 方法是否抽象方法 方法是否是合成方法(由java编译器生成的) | Class / Type / Method Class / Type / Method Method Method | deserialize(serialize(obj)) |
hasModifier | 是否同时存在一个或多个修饰符 | Constructor / Class / Method / Field | method.getModifiers() |
JAXBUtil:XML Java对象互转工具类
其里面主要针对 XML Schema产生Java对象 的一些功能进行封装
具体传参与返回值可查看接口文档,这里仅总览出常用的可完成的功能方法
方法 | 功能 | 支持类型 | 原理 |
---|
xmlToBean | XML文件转Bean | Reader 转 Class | XMLReader.parse |
beanToXml | JavaBean转换成xml | Object | 序列化实现 |