Java

您所在的位置:网站首页 java反射获取对象的值 Java

Java

2024-07-12 13:35| 来源: 网络整理| 查看: 265

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

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

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

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

相关链接:

官网 / 备用官网API 总览 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脚本执行封装,例如Javascripthutool-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中央库

cn.hutool hutool-all 5.8.0

若使用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 获取系统ClassLoaderloadClass通过传入类的字符串加载类:使用加载器ClassLoader(默认采用getClassLoader获取到的)加载,并初始化类(默认进行初始化,可指定是否初始化)Class.forName() / Array.newInstanceloadPrimitiveClass通过传入类的字符串加载原始类型的类 包括原始类型、原始类型数组和voidgetJarClassLoader创建新的 JarClassLoader,并使用此Classloader加载目录下的class文件和jar文件isPresent指定类是否被提供,通过loadClass 来加载,若加载到即为提供 2.2 ClassUtil:类相关工具类( API 文档 )

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

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

方法功能支持类型原理getClassesgetClass安全的获取对象类型获得对象数组的类数组T / Objectobj.getClass()getClassNamegetShortClassName获取类名,类名并不包含“.class”这个扩展名,可选择返回不带包名的类名获取完整类名的短格式,如 cn.hutool.core.util.StrUtil -》c.h.c.u.StrUtilObjectclazz.getEnclosingClassgetEnclosingClassisTopLevelClass是否为顶层类,即定义在包中的类,而非定义在类中的内部类返回定义此类或匿名类所在的类,如果类本身是在包中定义的,返回 nullClassscanPackageByAnnotationscanPackageBySuperscanPackage扫描指定包路径下所有包含指定注解的类扫描指定包路径下所有指定类或接口的子类或实现类扫描该包路径下所有class文件clazz.isAnnotationPresentgetPublicMethodNamesgetPublicMethods获得指定类中的Public方法名获得本类及其父类所有Public方法 / 过滤后的Public方法列表Classclazz.getMethodsgetDeclaredMethodNamesgetDeclaredMethods获得声明的所有方法,包括本类及其父类和接口的所有方法和Object类的方法名称获得声明的所有方法,包括本类及其父类和接口的所有方法和Object类的方法Classclazz.getDeclaredMethodsgetClassPathResourcesgetClassPathsgetClassPathURLgetJavaClassPaths获得ClassPath,默认不解码路径中的特殊字符(例如空格和中文)获得ClassPath,默认不解码路径中的特殊字符(例如空格和中文)获得ClassPath URL获得Java ClassPath路径Classclazz.getResourcegetResourcesgetResourceURLgetResourceUrl获取指定路径下的资源列表获得资源相对路径对应的URL获得资源相对路径对应的URLclazz.getResourcegetContextClassLoadergetClassLoaderloadClass获取当前线程的ClassLoader获取 ClassLoader加载类并初始化(默认进行初始化,可设置不进行初始化)Thread.currentThread().getContextClassLoader()Class.forName() / Array.newInstanceinvoke执行方法method.invokeisSimpleValueTypeisAssignableisPrimitiveWrapperisSimpleTypeOrArrayisBasicTypeisPublicisNotPublicisAbstractisNormalClassisEnum是否为简单值类型检查目标类是否可以从原类转化类是否为包装类型是否简单值类型或简单值类型的数组类是否为简单类型指定类是否为Public指定类是否为非public指定类是否为抽象类指定类是否为标准的类指定类是否为枚举类型Classclazz.isXXXisStaticsetAccessible方法是否为静态方法方法是否设置为可访问MethodgetTypeArgumentgetPackagegetPackagePathgetDefaultValuegetDefaultValuesgetPrimitiveDefaultValuegetLocation、getLocationPathisJdkClass获得给定类的第一个泛型参数获得给定类所在包的名称获得给定类所在包的路径获取指定类型分的默认值(原始类型为0,其他为null)获取指定类型分的默认值(数组)获取指定原始类型分的默认值获取class类路径URL / String path 是否为JDK中定义的类或接口(以java.、javax.开头的包名 或者 ClassLoader为null的类/接口为JDK中定义的类/接口)Class 2.3 ObjectUtil:对象相关工具类( API 文档 )

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

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

方法功能支持类型原理equals、equalnotEqual比较两个对象是否相等比较两个对象是否不相等ObjectObjects.equalsisNullisNotNullisEmptyisNotEmptyisAllEmpty、isAllNotEmpty检查对象是否为null 检查对象是否不为null判断指定对象是否为空判断指定对象是否不为空所有对象是否全都为空 / 不为空ObjectObjects.equals长度 / size 是否为0defaultIfNulldefaultIfEmptydefaultIfBlank如果给定对象为 null 返回默认值如果给定对象为 null 或者 “” 返回默认值TclonecloneIfPossiblecloneByStream克隆对象,如果对象实现Cloneable接口,调用其clone方法,如果实现Serializable接口,执行深度克隆,否则返回 null返回克隆后的对象,如果克隆失败,返回原对象序列化后拷贝流的方式克隆(必须实现Serializable接口)T反射执行 clone 方法ValidateObjectInputStream.readObject()lengthcontainshasNullhasEmptyemptyCount计算对象长度对象中是否包含指定元素多个对象中是否存在 null 对象多个对象是否存在 null 或 空对象多个对象存在多少个 null 或 空对象Objectserializedeserialize序列化 与 反序列化(必须实现Serializable接口)T / byte[]io操作isBasicTypeisValidIfNumber对象是否为基本类型,包括包装类型和非包装类型对象是否为有效的数字Objectclazz.isPrimitive()toString将Object转为StringObjectobj.toString()compare安全的对象比较TcompareTogetTypeArgument获得给定类的第一个泛型参数Object 2.4 TypeUtil:类的类型相关工具类( API 文档 )

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

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

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

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

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

方法功能支持类型原理getConstructor、getConstructorsgetConstructorsDirectly查找类中的指定参数的构造方法,如果找到构造方法,会自动设置可访问为true获得一个类中所有构造列表,直接反射获取,无缓存Classclazz.getDeclaredConstructors()hasFieldgetFieldNamegetFieldgetFieldMapgetFieldsgetFieldsDirectlygetFieldValuegetFieldsValuegetStaticFieldValuesetFieldValue找指定类中是否包含指定名称对应的字段,包括所有字段(包括非public字段),也包括父类和Object类的字段获取字段名查找指定类中的指定name的字段(包括非public字段),也包括父类和Object类的字段, 字段不存在则返回 null获取指定类中字段名和字段对应的有序Map,包括其父类中的字段获得一个类中所有字段列表,包括其父类中的字段获得一个类中所有字段列表,直接反射获取,无缓存获取字段值获取所有字段的值获取静态字段值设置字段值Classclazz.getDeclaredFields();getPublicMethodNamesgetPublicMethodsgetPublicMethodgetMethodOfObjgetMethodIgnoreCasegetMethodgetMethodByNamegetMethodByNameIgnoreCasegetMethodNamesgetMethodsgetMethodsDirectly获得指定类本类及其父类中的Public方法名(去除重载的方法)获得本类及其父类所有Public方法根据方法名称查找指定Public方法 如果找不到对应的方法或方法不为public的则返回根据方法名称查找指定对象中的所有方法(包括非public方法),也包括父对象和Object类的方法型根据方法名称查找指定方法(忽略大小写),如果找不到对应的方法则返回null根据方法名称查找指定方法 如果找不到对应的方法则返回null根据方法名称查找指定方法(忽略大小写),如果找不到对应的方法则返回null(忽略方法的参数)获得指定类中的Public方法名获得指定类过滤后的Public方法列表获得一个类中所有方法列表,直接反射获取,无缓存Classclazz.getMethods()isOuterClassField字段是否为父类引用字段(字段所在类是对象子类时(对象中定义的非static的class),会自动生成一个以"this$0"为名称的字段,指向父类对象)TypeequalsisEqualsMethodisHashCodeMethodisToStringMethodisEmptyParamisGetterOrSetterIgnoreCaseisGetterOrSetter方法是否为equals方法 、hashCode 方法 、 toString 方法、空参方法、get/set方法MethodequalsnewInstancenewInstancenewInstanceIfPossible实例化对象StringClassClass.forNameConstructor.newInstance();invokeStaticinvokeWithCheckinvokeinvoke执行方法Methodmethod.invokesetAccessible设置方法为可访问(私有方法可以被外部调用)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 文档 )

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

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

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

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

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

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3