本片内容收录在我的在线笔记 java-note-for-free 中。
笔记源文件在 gitee 中。
- org.springframework.util.ResourceUtils
- org.springframework.core.io.support.PropertiesLoaderUtils
- org.springframework.util.FileCopyUtils
- org.springframework.util.SerializationUtils
- org.springframework.util.Base64Utils
- org.springframework.util.DigestUtils
- org.springframework.util.StreamUtils
- org.springframework.util.PatternMatchUtils
- org.springframework.util.NumberUtils
- org.springframework.util.ClassUtils
- org.springframework.util.ReflectionUtils
- org.springframework.util.MultiValueMap
- org.springframework.beans.BeanUtils
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 { }
网友评论