Spring其他工具类

2018-12-31  本文已影响0人  hemiao3000

本片内容收录在我的在线笔记 java-note-for-free 中。

笔记源文件在 gitee 中。

org.springframework.util.ResourceUtils

用于处理表达资源字符串前缀描述资源的工具. 如: "classpath:"、"file:" 等。

在 ResourceUtils 中,赋予了 URL 更广泛的含义,它除了可以是网络资源外,还可以是本地资源(文件)。

本地资源的定位前缀常见有:classpath:file:


URL 和 URI

在原生 JDK 中,提供了 URI 和 URL 类,来标识资源的定位。

  • URI:统一资源标志符(Uniform Resource Identifier)
  • URL:统一资源定位符(uniform resource location)

简单说,URI 与 URL 都是定位资源位置的,就是表示这个资源的位置信息。<small>就像经纬度一样可以表示你在世界的哪个角落。</small>

URI 是一种更宽泛、更高级的概念,而 URL 则是 URI 的一个子集,就是说 URL 是 URI 的一种具体情况。换句话说,每个 URL 都是 URI,但是不是每个 URI 都是URL的。

他们之间最明显的不同就是在 java.net.URI 它只是表示一个位置,但是你没有办法通过 URI 获取到这个对象的流。

但是 URL 就不同了。java.net.URL 提供了更多更丰富的方法(openConnection()),通过该方法我们可以通过IO流操作他。


字符串、URL、URI

// 通过特定字符串,生成 URL 对象
static URL getURL(String resourceLocation) 

// 通过特定字符串,生成 URI 对象。并且 空格被替换成“%20”
static URI toURI(String location) 

// 通过 URL 生成 URI
static URI toURI(URL url) 

判断方法

// 判断字符串是否是一个合法的 URL 字符串
static boolean isUrl(String resourceLocation) 

获取资源对象

static File getFile(String resourceLocation)
static File getFile(URI resourceUri)
static File getFile(URL resourceUrl)

org.springframework.core.io.support.PropertiesLoaderUtils

加载 Properties 资源工具类,和 org.springframework.core.io.Resource 结合使用。

Resource 类

Resource 接口定义了“资源”的概念,其中常用方法有:

// 从资源中获得 File 对象
File    getFile()  

// 从资源中获得 URI 对象
URI getURI() 

// 从资源中获得 URI 对象
URL getURL() 

// 判断资源是否存在
boolean exists()  

// 获得资源的描述信息
String  getDescription() 

Resource 有多种实现类引用于不同的场景:

  • FileSystemResource : 通过 File 对象生成 Resource 对象。
  • FileUrlResource:通过 “file:” 前缀的字符串生成 Resource 对象。
  • ClassPathResource:从 class path 中查找文件,以生成 Resource 对象。
  • UrlResource:通过 URL 生成 Resource 对象。支持各种前缀。

InputStreamResource 是 Resource 接口的子接口,其实现类 EncodedResource 支持通过 InputStream 生成 Resource 对象,并且可以设置编码。(其他 Resource 都是使用 ISO-8859-1 编码)。

// 查找资源,并生成 Properties 对象。使用 ISO-8859-1 编码
static Properties   loadProperties(Resource resource) 

// 从 classpath 中查找资源,并生成 Properties 对象。使用 ISO-8859-1 编码
static Properties   loadAllProperties(String resourceName) 

// 查找资源,并生成 Properties 对象
static Properties   loadProperties(EncodedResource resource) 

// 查找资源,填充参数对象
static void fillProperties(Properties props, Resource resource) 

// 查找资源,填充参数对象
static void fillProperties(Properties props, EncodedResource resource) 

org.springframework.util.FileCopyUtils

文件的拷贝处理工具类, 结合 Resource 的概念一起来处理, 真的是很方便

输出

// 从字节数组到文件
static void copy(byte[] in, File out)      

// 从文件到文件
static int  copy(File in, File out)        

// 从字节数组到输出流
static void copy(byte[] in, OutputStream out) 

// 从输入流到输出流
static int  copy(InputStream in, OutputStream out) 

// 从输入流到输出流
static int  copy(Reader in, Writer out)    

// 从字符串到输出流
static void copy(String in, Writer out)    

输入

// 从文件中读入到字节数组中
static byte[]   copyToByteArray(File in)    

// 从输入流中读入到字节数组中
static byte[]   copyToByteArray(InputStream in) 

// 从输入流中读入到字符串中
static String   copyToString(Reader in)     

org.springframework.util.SerializationUtils

SerializationUtils 用于 java 的序列化与反序列化. serialize 与 deserialize 方法

// 序列化方法
static byte[]   serialize(Object object) 

// 反序列化方法
static Object   deserialize(byte[] bytes) 

org.springframework.util.Base64Utils

Base64 是网络上最常见的用于传输 8 Bit 字节码的编码方式之一,Base64 就是一种基于 64 个可打印字符来表示二进制数据的方法。

Base64 编码是从二进制到字符的过程,可用于在 HTTP 环境下传递较长的标识信息。

采用 Base64 编码具有不可读性,需要解码后才能阅读。

编码方法

static byte[]   encode(byte[] src)
static String   encodeToString(byte[] src)

static byte[]   encodeUrlSafe(byte[] src)
static String   encodeToUrlSafeString(byte[] src)

解码方法

static byte[]   decode(byte[] src)
static byte[]   decodeFromString(String src)

static byte[]   decodeUrlSafe(byte[] src)
static byte[]   decodeFromUrlSafeString(String src)

BASE64-字母表

字符 十进制 十六进制 字符 十进制 十六进制 字符 十进制 十六进制
A 0 00 W 22 16 s 44 2C
B 1 01 X 23 17 t 45 2D
C 2 02 Y 24 18 u 46 2E
D 3 03 Z 25 19 v 47 2F
E 4 04 a 26 1A w 48 30
F 5 05 b 27 1B x 49 31
G 6 06 c 28 1C y 50 32
H 7 07 d 29 1D z 51 33
I 8 08 e 30 1E 0 52 34
J 9 09 f 31 1F 1 53 35
K 10 0A g 32 20 2 54 36
L 11 0B h 33 21 3 55 37
M 12 0C i 34 22 4 56 38
N 13 0D j 35 23 5 57 39
O 14 0E k 36 24 6 58 3A
P 15 0F l 37 25 7 59 3B
Q 16 10 m 38 26 8 60 3C
R 17 11 n 39 27 9 61 3D
S 18 12 o 40 28 + 62 3E
T 19 13 p 41 29 / 63 3F
U 20 14 q 42 2A
V 21 15 r 43 2B = (pad) (pad)

在“URL and Filename Safe”字母表中,+号会被替换成-号,进行编解码。同理,/号会被替换成_

org.springframework.util.DigestUtils

摘要处理, 这里有用于 md5 处理信息的

// 生成 MD5 摘要信息
static byte[] md5Digest(byte[] bytes) 

// 生成 MD5 摘要信息
static byte[] md5Digest(InputStream inputStream) 

// 生成 MD5 摘要信息
static String md5DigestAsHex(byte[] bytes) 

// 生成 MD5 摘要信息
static String md5DigestAsHex(InputStream inputStream) 

org.springframework.util.StreamUtils

输出

static void copy(byte[] in, OutputStream out)
static int  copy(InputStream in, OutputStream out)
static void copy(String in, Charset charset, OutputStream out)
static long copyRange(InputStream in, OutputStream out, long start, long end)

输入

static byte[]   copyToByteArray(InputStream in)
static String   copyToString(InputStream in, Charset charset)

// 舍弃输入流中的内容
static int  drain(InputStream in) 

实例化

static InputStream  emptyInput()

// 所生成的 输入流 close() 方法无效
static InputStream  nonClosing(InputStream in) 

// 所生成的 输出流 close() 方法无效
static OutputStream nonClosing(OutputStream out) 

org.springframework.util.PatternMatchUtils

简易正则匹配:判断字符串中是否符合正则规则。

判断规则有:xxx*, *xxx, *xxx*xxx*yyy* 通配任意个字符。

注意,正则规则字符串在前。

// 判断字符串是否符合规则。
static boolean  simpleMatch(String pattern, String str)

// 判断字符串是否同时满足多个规则。
static boolean  simpleMatch(String[] patterns, String str)

org.springframework.util.NumberUtils

处理数字的工具类, 有 parseNumber 可以把字符串处理成我们指定的数字格式, 还支持 format 格式, convertNumberToTargetClass 可以实现 Number 类型的转化.

// Convert the given number into an instance of the given target class.
static <T extends Number>
T   convertNumberToTargetClass(Number number, Class<T> targetClass)
// Parse the given text into a Number instance of the given target class, using the corresponding decode / valueOf method.
static <T extends Number>
T   parseNumber(String text, Class<T> targetClass)
// Parse the given text into a Number instance of the given target class, using the supplied NumberFormat.
static <T extends Number>
T   parseNumber(String text, Class<T> targetClass, NumberFormat numberFormat)

org.springframework.util.ClassUtils

org.springframework.util.ClassUtils 用于对 Class 的处理。

判断

// 判断是否具有指定方法。包括继承来的和私有的。
static boolean  hasAtLeastOneMethodWithName(Class<?> clazz, String methodName) 

// 判断是否具有指定的 public 构造方法
static boolean  hasConstructor(Class<?> clazz, Class<?>... paramTypes) 

// 判断是否具有指定的方法
static boolean  hasMethod(Class<?> clazz, String methodName, Class<?>... paramTypes) 

// 判断右操作数是否可以给左操作数赋值
static boolean  isAssignable(Class<?> lhsType, Class<?> rhsType) 

// 判断是否可以为该类对象赋指定值
static boolean  isAssignableValue(Class<?> type, Object value)  

// 判断对象是否是 CGLIB 代理对象
static boolean  isCglibProxy(Object object)  

// 判断类是否是 CGLIB 所生成的类
static boolean  isCglibProxyClass(Class<?> clazz) 

// 同上
static boolean  isCglibProxyClassName(String className) 

// 判断类的类型是否是个接口
static boolean  isJavaLanguageInterface(Class<?> ifc) 

// 是否是包装类
static boolean  isPrimitiveWrapper(Class<?> clazz)   

// 是否是基本类型,或包装类型
static boolean  isPrimitiveOrWrapper(Class<?> clazz) 

// 判断是否是基本类型数组
static boolean  isPrimitiveArray(Class<?> clazz)     

// 判断是否是包装类数组
static boolean  isPrimitiveWrapperArray(Class<?> clazz)  

// 判断类是否是指定名称
static boolean  matchesTypeName(Class<?> clazz, String typeName) 

类名

// 获得类的完全限定名
static String   getQualifiedName(Class<?> clazz)  

// 获得类名,不包含包名部分
static String   getShortName(Class<?> clazz)      

// 同上
static String   getShortName(String className)    

// 获得类名(不包含包名),仿照 JavaBeans property 形式,全小写。
static String   getShortNameAsProperty(Class<?> clazz) 

// 完全限定名。返回字符串形如:[xxx, xxx, xxx]
static String   classNamesToString(Class<?>... classes)           

// 同上
static String   classNamesToString(Collection<Class<?>> classes)  

// 类名转换,“.”转“/”
static String   convertClassNameToResourcePath(String className)    

// 类名转换,“/”转“.”
static String   convertResourcePathToClassName(String resourcePath) 

// 获得类的文件名,不包括类名。形如 xxx.class 形式
static String   getClassFileName(Class<?> clazz)  

包名

// 获得类的包名
static String   getPackageName(Class<?> clazz) 

// 同上
static String   getPackageName(String fqClassName) 

// 返回类的包名,其中“.”用“/”代替。
static String   classPackageAsResourcePath(Class<?> clazz) 

方法

// 获得方法的完全限定名
static String   getQualifiedMethodName(Method method) 

// 同上
static String   getQualifiedMethodName(Method method, Class<?> clazz) 

// 获得构造方法
static <T> Constructor<T>   getConstructorIfAvailable(Class<T> clazz, Class<?>... paramTypes) 

// 获得方法
static Method   getMethod(Class<?> clazz, String methodName, Class<?>... paramTypes) 

// 同上。无指定方法时返回 null
static Method   getMethodIfAvailable(Class<?> clazz, String methodName, Class<?>... paramTypes) 

// 获得指定的静态方法
static Method   getStaticMethod(Class<?> clazz, String methodName, Class<?>... args)  

// 获得方法的数量
static int  getMethodCountForName(Class<?> clazz, String methodName) 

生成/获得 类对象

// 生成类对象。 原生 Class.forName() 的替代品
static Class<?> forName(String name, ClassLoader classLoader) 

// 根据类名字符串生成 Class 对象。
static Class<?> resolveClassName(String className, ClassLoader classLoader) 

// 获得参数对象所实现的所有接口,包括其父类实现的。
static Class<?>[]   getAllInterfaces(Object instance)         

// 同上
static Class<?>[]   getAllInterfacesForClass(Class<?> clazz)  

其他

// 获得默认的 Class Loader
static ClassLoader  getDefaultClassLoader() 

// 类对象的集合 --> 成类对象的数组。
static Class<?>[]   toClassArray(Collection<Class<?>> collection) 

// 返回类的包路径,并在其后追加一个指定文件名。
static String   addResourcePathToPackagePath(Class<?> clazz, String resourceName) 

org.springframework.util.ReflectionUtils

反射常用工具方法. 有 findField, setField, getField, findMethod, invokeMethod 等有用的方法

<small>注意,实验反射效果时,不要使用内部类,或同文件多类的形式,必须使用标准形式。即类前必须有 public 修饰。</small>

操作属性

查找属性

static Field findField(Class<?> clazz, String name) // 在类中查找指定属性
static Field    findField(Class<?> clazz, String name, Class<?> type) // 在类中,按名字和类型查找指定属性。

判断

static boolean  isPublicStaticFinal(Field field) // 是否为一个 "public static final" 属性。

属性的 get/set 操作

static Object   getField(Field field, Object target) // 对对象的属性执行取值操作。
static void setField(Field field, Object target, Object value) // 对对象的属性执行赋值操作。
static void shallowCopyFieldState(Object src, Object dest) // 同类对象属性对等赋值。
static void makeAccessible(Field field) // 取消 Java 的权限控制检查,访问私有属性

遍历执行

static void doWithFields(Class<?> clazz, ReflectionUtils.FieldCallback fc) // 对类的每个属性执行 callback .
static void doWithFields(Class<?> clazz, ReflectionUtils.FieldCallback fc, ReflectionUtils.FieldFilter ff) // 同上,多了个属性过滤功能。
static void doWithLocalFields(Class<?> clazz, ReflectionUtils.FieldCallback fc) // 同 doWithFields,但不包括继承而来的属性。

操作方法

查找方法

static Method   findMethod(Class<?> clazz, String name) // 在类中查找指定方法。
static Method   findMethod(Class<?> clazz, String name, Class<?>... paramTypes) // 同上,额外提供方法参数类型作查找条件。
static Method[] getAllDeclaredMethods(Class<?> leafClass) // 获得类中所有方法,包括继承而来的。
static <T> Constructor<T>   accessibleConstructor(Class<T> clazz, Class<?>... parameterTypes) // 在类中查找指定构造方法

判断

static boolean  isEqualsMethod(Method method) // 是否是 equals 方法
static boolean  isHashCodeMethod(Method method) // 是否是 hashCode 方法
static boolean  isToStringMethod(Method method) // 是否是 toString 方法
static boolean  isObjectMethod(Method method) // 是否是从 Object 类继承而来的方法

执行方法

static Object   invokeMethod(Method method, Object target)  // 执行方法
static Object   invokeMethod(Method method, Object target, Object... args) // 同上
static void makeAccessible(Method method) // 取消 Java 权限检查,执行私有方法
static void makeAccessible(Constructor<?> ctor) // 取消 Java 权限检查,执行私有构造方法

遍历执行

static void doWithMethods(Class<?> clazz, ReflectionUtils.MethodCallback mc) // 遍历执行类中的每个方法。包括从父类继承而来的方法。
static void doWithMethods(Class<?> clazz, ReflectionUtils.MethodCallback mc, ReflectionUtils.MethodFilter mf) // 同上。增加了匹配/过滤功能。
static void doWithLocalMethods(Class<?> clazz, ReflectionUtils.MethodCallback mc) // 同上。不包括从父类继承而来的方法。

异常

static boolean  declaresException(Method method, Class<?> exceptionType) // 检查一个方法是否声明抛出指定异常。

org.springframework.util.MultiValueMap

MultiValueMap 是一种新的容器接口,它继承自 Map,支持一个键对应多个值。它除了支持 Map 接口的各方法外,还有一些自己的“独特”方法。

LinkedMultiValueMap 是 MultiValueMap 的实现类之一 。

实例化/初始化

LinkedMultiValueMap() // 构造方法
LinkedMultiValueMap(Map<K, List<V>> otherMap) // 构造方法。通过一个 Map<K, List<V>> 对象来创建 LinkedMultiValueMap 对象。

void    addAll(K key, List<? extends V> values) // 向 MultiValueMap 中添加一个键,及其对应的多个值。
void    addAll(MultiValueMap<K, V> values) // 向 MultiValueMap 中添加多对键值对。

V   getFirst(K key)   // 返回匹配 key 的第一个 value。

void    set(K key, V value) // 为指定 key 赋值。该 key 原来的值会被全部覆盖掉。
void    setAll(Map<K, V> values) // 批量赋值

Map<K,V>    toSingleValueMap() // 返回一个普通的 Map,该 Map 中仅包含每个 key 对应的第一个 value。

org.springframework.beans.BeanUtils

首先需要注意的时,BeanUtils 来源于 spring-bean 而非 spring-core 。

实例化对

<T> T instantiateClass(Class<T> clazz)
<T> T instantiateClass(Class<?> clazz, Class<T> assignableTo) // 参数 assignableTo 用于指明将要赋值的引用的类型。
<T> T instantiateClass(Constructor<T> ctor, Object... args)

查找方法

// findMethod 方法优先返回 public 方法(自己的,或继承而来的),在待查找方法是非 public 的情况下,它等同于 findDeclaredMethod 方法。
// 官方建议在使用它之前调用 Class.getMethod 方法,判断是否存在 public 权限的方法,以实现仅在 public 范围内查找。
Method findMethod(Class<?> clazz, String methodName, Class<?>... paramTypes)
Method findMethodWithMinimalParameters(Class<?> clazz, String methodName)
Method findMethodWithMinimalParameters(Method[] methods, String methodName)

// 在所有访问权限范文内查找的方法。不仅仅是 publi 的。
Method findDeclaredMethod(Class<?> clazz, String methodName, Class<?>... paramTypes)
Method findDeclaredMethodWithMinimalParameters(Class<?> clazz, String methodName)

属性赋值

void copyProperties(Object source, Object target) throws BeansException { }
void copyProperties(Object source, Object target, Class<?> editable) throws BeansException { }
void copyProperties(Object source, Object target, String... ignoreProperties) throws BeansException { }
上一篇下一篇

猜你喜欢

热点阅读