Java - HuTool 使用 ReflectUtil、ClassUtil等工具类(二)

Java - HuTool 使用 ReflectUtil、ClassUtil等工具类(二)

本篇主要介绍 HuTool工具, 其是 java工具类,对于一些静态方法进行封装,虽然很小,但很全,里面拥有平时我们会用到的工具类,就无需我们自己去封装了

以前我还自己去封装,emmm,我真的太傻了~,但是自己封装也不是不好,但是学会站在巨人的肩膀上,也非常有必要

下面就简单介绍一下 HuTool工具 与 其简单使用

相关链接:

HuTool 工具介绍

Hutool 是一个小而全的 Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,涵盖了Java开发开发中的方方面面

使用 Hutool 可节省开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug

该工具类主要对 文件、流、加密解密、转码、正则、线程、XML等 JDK方法进行封装,组成各种Util工具类,同时提供以下组件:

模块介绍
hutool-aopJDK动态代理封装,提供非IOC下的切面支持
hutool-bloomFilter布隆过滤,提供一些Hash算法的布隆过滤
hutool-cache简单缓存实现
hutool-core核心,包括Bean操作、日期、各种Util等
hutool-cron定时任务模块,提供类Crontab表达式的定时任务
hutool-crypto加密解密模块,提供对称、非对称和摘要算法封装
hutool-dbJDBC封装后的数据操作,基于ActiveRecord思想
hutool-dfa基于DFA模型的多关键字查找
hutool-extra扩展模块,对第三方封装(模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等)
hutool-http基于HttpUrlConnection的Http客户端封装
hutool-log自动识别日志实现的日志门面
hutool-script脚本执行封装,例如Javascript
hutool-setting功能更强大的Setting配置文件和Properties封装
hutool-system系统参数调用封装(JVM信息等)
hutool-jsonJSON实现
hutool-captcha图片验证码实现
hutool-poi针对POI中Excel和Word的封装
hutool-socket基于Java的NIO和AIO的Socket封装
hutool-jwtJSON Web Token (JWT)封装实现

可根据需求对每个模块 单独引入,也可以通过引入hutool-all方式引入所有模块

HuTool工具使用

HuTool 工具 的API文档与官网把其能干的事情说的很详细了,下面主要是列举出工具类能干什么,方法有哪些,顺带可以提一下原理是啥,会用并且懂原理是最好的学习方式

1、导包

使用首先导包,在项目的 pom.xml 中加入以下内容:【Hutool 5.x 支持 JDK8+,JDK7 使用 Hutool 4.x版本】Maven中央库

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.0</version>
</dependency>

若使用jar包,可去该 下载jar 网址下载hutool-all-X.X.X.jar即可

2、使用

本小节主要围绕着 hutool 提供的工具类/功能为小点进行说明,一部分的说明来自官方文档,一部分来自看的源码,这里的源码版本为对应5.8.0(若与您看的源码有所不同,请查看版本是否相同)

本篇博客主要对 对象、类、类加载、类的类型判断、反射 等相关功能进行了封装( API 文档

  • ClassLoaderUtil:ClassLoader 工具类
  • ClassUtil:类工具类
  • ObjectUtil:对象工具类
  • TypeUtil:针对Type的工具类封装
  • ReflectUtil:反射工具类
  • ReferenceUtil: 引用工具类
  • JAXBUtil:JAXB(Java Architecture for XML Binding),根据XML Schema产生Java对象
  • SerializeUtil:类序列化工具类
  • ModifierUtil:类修饰符工具类
2.1 ClassLoaderUtil:ClassLoader 工具类( API 文档

ClassLoader 工具类主要完成对类的加载,具体传参与返回值可查看接口文档,这里仅总览出可完成的功能方法

方法功能原理
getContextClassLoader获取当前线程的 ClassLoaderThread.currentThread().getContextClassLoader()
getSystemClassLoader获取系统 ClassLoaderClassLoader.getSystemClassLoader()
getClassLoader获取 ClassLoader,获取顺序如下:
获取当前线程的ContextClassLoader
获取当前类对应的ClassLoader
获取系统ClassLoader
loadClass通过传入类的字符串加载类:
使用加载器ClassLoader(默认采用getClassLoader获取到的)加载,并初始化类(默认进行初始化,可指定是否初始化)
Class.forName() / Array.newInstance
loadPrimitiveClass通过传入类的字符串加载原始类型的类 包括原始类型、原始类型数组和void
getJarClassLoader创建新的 JarClassLoader,并使用此Classloader加载目录下的class文件和jar文件
isPresent指定类是否被提供,通过loadClass 来加载,若加载到即为提供
2.2 ClassUtil:类相关工具类( API 文档

其里面主要针对类的一些功能进行实现

具体传参与返回值可查看接口文档,这里仅总览出可完成的功能方法

方法功能支持类型原理
getClasses
getClass
安全的获取对象类型
获得对象数组的类数组
T / Objectobj.getClass()
getClassName
getShortClassName
获取类名,类名并不包含“.class”这个扩展名,可选择返回不带包名的类名
获取完整类名的短格式,如 cn.hutool.core.util.StrUtil -》c.h.c.u.StrUtil
Objectclazz.getEnclosingClass
getEnclosingClass
isTopLevelClass
是否为顶层类,即定义在包中的类,而非定义在类中的内部类
返回定义此类或匿名类所在的类,如果类本身是在包中定义的,返回 null
Class
scanPackageByAnnotation
scanPackageBySuper
scanPackage
扫描指定包路径下所有包含指定注解的类
扫描指定包路径下所有指定类或接口的子类或实现类
扫描该包路径下所有class文件
clazz.isAnnotationPresent
getPublicMethodNames
getPublicMethods
获得指定类中的Public方法名
获得本类及其父类所有Public方法 / 过滤后的Public方法列表
Classclazz.getMethods
getDeclaredMethodNames
getDeclaredMethods
获得声明的所有方法,包括本类及其父类和接口的所有方法和Object类的方法名称
获得声明的所有方法,包括本类及其父类和接口的所有方法和Object类的方法
Classclazz.getDeclaredMethods
getClassPathResources
getClassPaths
getClassPathURL
getJavaClassPaths
获得ClassPath,默认不解码路径中的特殊字符(例如空格和中文)
获得ClassPath,默认不解码路径中的特殊字符(例如空格和中文)
获得ClassPath URL
获得Java ClassPath路径
Classclazz.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
指定类是否为抽象类
指定类是否为标准的类
指定类是否为枚举类型
Classclazz.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
2.3 ObjectUtil:对象相关工具类( API 文档

其里面主要针对对象Object的一些功能进行实现

具体传参与返回值可查看接口文档,这里仅总览出可完成的功能方法

方法功能支持类型原理
equals、equal
notEqual
比较两个对象是否相等
比较两个对象是否不相等
ObjectObjects.equals
isNull
isNotNull
isEmpty
isNotEmpty
isAllEmpty、isAllNotEmpty
检查对象是否为null
检查对象是否不为null
判断指定对象是否为空
判断指定对象是否不为空
所有对象是否全都为空 / 不为空
ObjectObjects.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
对象是否为基本类型,包括包装类型和非包装类型
对象是否为有效的数字
Objectclazz.isPrimitive()
toString将Object转为StringObjectobj.toString()
compare安全的对象比较TcompareTo
getTypeArgument获得给定类的第一个泛型参数Object
2.4 TypeUtil:类的类型相关工具类( API 文档

其里面主要针对 Type 的一些功能进行封装

具体传参与返回值可查看接口文档,这里仅总览出可完成的功能方法

方法功能支持类型原理
getClass获得原始类Type / Field
getType
getFieldType
获取字段Field对应的Type类型
根据字段名称获得字段的泛型类型
Object
getFirstParamType
getFirstParamClass
getParamType
getParamClass
getParamTypes
getParamClasses
getReturnType
getReturnClass
获取方法的第一个参数类型
获取方法的第一个参数类
获取方法指定位置的参数类型
获取方法指定位置的参数类
获取方法的参数类型列表
获取方法的参数类列表
获取方法的返回值类型
获取方法的返回值类
Methodmethod.getxxxx()
toParameterizedType
将 Type 转换为ParameterizedType,一般用于获取泛型参数具体的参数类型Type
getTypeArgument获得给定类的第一个泛型参数Type
getActualType
getActualTypes
获得泛型字段对应的泛型实际类型,如果此变量没有对应的实际类型,返回null
获得泛型变量对应的泛型实际类型数组
Type
getTypeMap获取泛型变量和泛型实际类型的对应关系MapClass
hasTypeVariable指定泛型数组中是否含有泛型变量Type…obj.toString()
isUnknown指定类型是否是未知类型(type为null或者 TypeVariable 都视为未知类型)Type
2.5 ReflectUtil:反射相关工具类( API 文档

其里面主要针对 反射的一些功能进行封装

具体传参与返回值可查看接口文档,这里仅总览出可完成的功能方法

方法功能支持类型原理
getConstructor、getConstructors
getConstructorsDirectly
查找类中的指定参数的构造方法,如果找到构造方法,会自动设置可访问为true
获得一个类中所有构造列表,直接反射获取,无缓存
Classclazz.getDeclaredConstructors()
hasField
getFieldName
getField
getFieldMap
getFields
getFieldsDirectly
getFieldValue
getFieldsValue
getStaticFieldValue
setFieldValue
找指定类中是否包含指定名称对应的字段,包括所有字段(包括非public字段),也包括父类和Object类的字段
获取字段名
查找指定类中的指定name的字段(包括非public字段),也包括父类和Object类的字段, 字段不存在则返回 null
获取指定类中字段名和字段对应的有序Map,包括其父类中的字段
获得一个类中所有字段列表,包括其父类中的字段
获得一个类中所有字段列表,直接反射获取,无缓存
获取字段值
获取所有字段的值
获取静态字段值
设置字段值
Classclazz.getDeclaredFields();
getPublicMethodNames
getPublicMethods
getPublicMethod
getMethodOfObj
getMethodIgnoreCase
getMethod
getMethodByName
getMethodByNameIgnoreCase
getMethodNames
getMethods
getMethodsDirectly
获得指定类本类及其父类中的Public方法名(去除重载的方法)
获得本类及其父类所有Public方法
根据方法名称查找指定Public方法 如果找不到对应的方法或方法不为public的则返回
根据方法名称查找指定对象中的所有方法(包括非public方法),也包括父对象和Object类的方法型
根据方法名称查找指定方法(忽略大小写),如果找不到对应的方法则返回null
根据方法名称查找指定方法 如果找不到对应的方法则返回null
根据方法名称查找指定方法(忽略大小写),如果找不到对应的方法则返回null(忽略方法的参数)
获得指定类中的Public方法名
获得指定类过滤后的Public方法列表
获得一个类中所有方法列表,直接反射获取,无缓存
Classclazz.getMethods()
isOuterClassField字段是否为父类引用字段(字段所在类是对象子类时(对象中定义的非static的class),会自动生成一个以"this$0"为名称的字段,指向父类对象)Typeequals
isEqualsMethod
isHashCodeMethod
isToStringMethod
isEmptyParam
isGetterOrSetterIgnoreCase
isGetterOrSetter
方法是否为equals方法 、hashCode 方法 、 toString 方法、空参方法、get/set方法
Methodequals
newInstance
newInstance
newInstanceIfPossible
实例化对象String
Class
Class.forName
Constructor.newInstance();
invokeStatic
invokeWithCheck
invoke
invoke
执行方法Methodmethod.invoke
setAccessible设置方法为可访问(私有方法可以被外部调用)Class、Method、FieldAccessibleObject.setAccessible(true)
2.6 ReferenceUtil: 引用相关工具类( API 文档

其里面主要针对 类引用 的一些功能进行封装,一般引用会分为三种:

  • SoftReference:软引用,在GC报告内存不足时会被GC回收
  • WeakReference: 弱引用,在GC时发现弱引用会回收其对象
  • PhantomReference:虚引用,在GC时发现虚引用对象,会将加入队列,此时对象未被真正回收,要等到队列被真正处理后才会被回收

其中只有一个 create 方法来创建引用

2.7 SerializeUtil:类序列化工具类( API 文档

其里面主要针对 类序列化 的一些功能进行封装

具体传参与返回值可查看接口文档,这里仅总览出可完成的功能方法

方法功能支持类型原理
clone序列化后拷贝流的方式克隆Type / Fielddeserialize(serialize(obj))
serialize序列化
对象必须实现Serializable接口
Tio操作
deserialize反序列化
对象必须实现Serializable接口
byte[]io操作
2.8 ModifierUtil:类修饰符相关工具类( API 文档

其里面主要针对 类修饰符 的一些功能进行封装

具体传参与返回值可查看接口文档,这里仅总览出可完成的功能方法

方法功能支持类型原理
isPublic
isStatic
isAbstract
isSynthetic
是否是Public方法 / 类/ 字段
是否是Static方法 / 类/ 字段
方法是否抽象方法
方法是否是合成方法(由java编译器生成的)
Class / Type / Method
Class / Type / Method
Method
Method
deserialize(serialize(obj))
hasModifier是否同时存在一个或多个修饰符Constructor / Class / Method / Fieldmethod.getModifiers()
2.9 JAXBUtil:XML Java对象互转工具类( API 文档

其里面主要针对 XML Schema产生Java对象 的一些功能进行封装

具体传参与返回值可查看接口文档,这里仅总览出可完成的功能方法

方法功能支持类型原理
xmlToBeanXML文件转BeanReader 转 ClassXMLReader.parse
beanToXmlJavaBean转换成xmlObject序列化实现

总结

我觉得这一类别算是比较常用的,尤其是反射、类的类型判断等相关工具类,例如获取泛型getTypeArgument等相关功能若自己封装,可能考虑的不全,若需反射执行方法传参可能会出现问题

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
HuTool是一个Java工具类库,它封装了一些常用的静态方法,提供了一些实用的工具类,使开发人员无需自己进行封装。其中包括ClassLoaderUtil、ClassUtil、ObjectUtil、TypeUtil、ReflectUtil、ReferenceUtil、JAXBUtil、SerializeUtil和ModifierUtil等工具类。 其中,ClassLoaderUtil是ClassLoader的工具类,用于获取当前线程的ClassLoader;而ClassUtil是类的工具类,用于获取ClassUtil类的ClassLoader。 总之,HuTool提供了许多方便的工具类,可以帮助开发人员更轻松地处理对象、类、类加载、类的类型判断和反射等相关功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java - HuTool 使用 ReflectUtilClassUtil工具类(二)](https://blog.csdn.net/weixin_42272869/article/details/124809368)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Hutool之类处理相关工具——ClassUtil](https://blog.csdn.net/weixin_39972768/article/details/111487448)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值