HuTool工具使用类加载、反射、对象操作等工具类

本章节主要介绍 ReflectUtil、ClassUtil等工具类的使用,涵盖对象、类、类加载、类的类型判断、反射等操作,涉及到的工具类如下: ClassLoaderUtil:ClassLoader 工具类 ClassUtil:类工具类 ObjectUtil:对象工具类 TypeUtil:针对Typ

本章节主要介绍 ReflectUtil、ClassUtil等工具类的使用,涵盖对象、类、类加载、类的类型判断、反射等操作,涉及到的工具类如下:

  • ClassLoaderUtil:ClassLoader 工具类

  • ClassUtil:类工具类

  • ObjectUtil:对象工具类

  • TypeUtil:针对Type的工具类封装

  • ReflectUtil:反射工具类

  • ReferenceUtil: 引用工具类

  • JAXBUtil:JAXB(Java Architecture for XML Binding),根据XML Schema产生Java对象

  • SerializeUtil:类序列化工具类

  • ModifierUtil:类修饰符工具类

这里简单介绍一下常用几种类别:

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

序列化实现

Comment