天天看點

推薦好用 Spring Boot 内置工具類

作者:程式猿久一

最近發現同僚寫了不少重複的工具類,發現其中很多功能,Spring 自帶的都有。于是整理了本文,希望能夠幫助到大家!

斷言

1. 斷言是一個邏輯判斷,用于檢查不應該發生的情況

2. Assert 關鍵字在 JDK1.4 中引入,可通過 JVM 參數

-enableassertions

開啟

3. SpringBoot 中提供了 Assert 斷言工具類,通常用于資料合法性檢查

// 要求參數 object 必須為非空(Not ),否則抛出異常,不予放行
// 參數 message 參數用于定制異常資訊。
void not(Object object, String message)
// 要求參數必須空,否則抛出異常,不予『放行』。
// 和 not 方法斷言規則相反
void is(Object object, String message)
// 要求參數必須為真(True),否則抛出異常,不予『放行』。
void isTrue(boolean expression, String message)
// 要求參數(List/Set)必須非空(Not Empty),否則抛出異常,不予放行
void notEmpty(Collection collection, String message)
// 要求參數(String)必須有長度(即,Not Empty),否則抛出異常,不予放行
void hasLength(String text, String message)
// 要求參數(String)必須有内容(即,Not Blank),否則抛出異常,不予放行
void hasText(String text, String message)
// 要求參數是指定類型的執行個體,否則抛出異常,不予放行
void isInstanceOf(Class type, Object obj, String message)
// 要求參數 `subType` 必須是參數 superType 的子類或實作類,否則抛出異常,不予放行
void isAssignable(Class superType, Class subType, String message)           

對象、數組、集合

ObjectUtils

1. 擷取對象的基本資訊

// 擷取對象的類名。參數為 時,傳回字元串:"" 
String SafeClassName(Object obj)
// 參數為 時,傳回 0
int SafeHashCode(Object object)
// 參數為 時,傳回字元串:""
String SafeToString(boolean[] array)
// 擷取對象 HashCode(十六進制形式字元串)。參數為 時,傳回 0
String getIdentityHexString(Object obj)
// 擷取對象的類名和 HashCode。 參數為 時,傳回字元串:""
String identityToString(Object obj)
// 相當于 toString方法,但參數為 時,傳回字元串:""
String getDisplayString(Object obj)           

2. 判斷工具

// 判斷數組是否為空
boolean isEmpty(Object[] array)
// 判斷參數對象是否是數組
boolean isArray(Object obj)
// 判斷數組中是否包含指定元素
boolean containsElement(Object[] array, Object element)
// 相等,或同為 時,傳回 true
boolean SafeEquals(Object o1, Object o2)
/*
判斷參數對象是否為空,判斷标準為:
Optional: Optional.empty
Array: length == 0
CharSequence: length == 0
Collection: Collection.isEmpty
Map: Map.isEmpty
*/
boolean isEmpty(Object obj)           

3. 其他工具方法

// 向參數數組的末尾追加新元素,并傳回一個新數組
<A, O extends A> A addObjectToArray(A[] array, O obj)
// 原生基礎類型數組 --> 包裝類數組
Object toObjectArray(Object source)           

StringUtils

1. 字元串判斷工具

// 判斷字元串是否為 ,或 ""。注意,包含空白符的字元串為非空
boolean isEmpty(Object str)
// 判斷字元串是否是以指定内容結束。忽略大小寫
boolean endsWithIgnoreCase(String str, String suffix)
// 判斷字元串是否已指定内容開頭。忽略大小寫
boolean startsWithIgnoreCase(String str, String prefix)
// 是否包含空白符
boolean containsWhitespace(String str)
// 判斷字元串非空且長度不為 0,即,Not Empty
boolean hasLength(CharSequence str)
// 判斷字元串是否包含實際内容,即非僅包含空白符,也就是 Not Blank
boolean hasText(CharSequence str)
// 判斷字元串指定索引處是否包含一個子串。
boolean substringMatch(CharSequence str, int index, CharSequence substring)
// 計算一個字元串中指定子串的出現次數
int countOccurrencesOf(String str, String sub)           

2. 字元串操作工具

// 查找并替換指定子串
String replace(String inString, String oldPattern, String newPattern)
// 去除尾部的特定字元
String trimTrailingCharacter(String str, char trailingCharacter)
// 去除頭部的特定字元
String trimLeadingCharacter(String str, char leadingCharacter)
// 去除頭部的空白符
String trimLeadingWhitespace(String str)
// 去除頭部的空白符
String trimTrailingWhitespace(String str)
// 去除頭部和尾部的空白符
String trimWhitespace(String str)
// 删除開頭、結尾和中間的空白符
String trimAllWhitespace(String str)
// 删除指定子串
String delete(String inString, String pattern)
// 删除指定字元(可以是多個)
String deleteAny(String inString, String charsToDelete)
// 對數組的每一項執行 trim 方法
String trimArrayElements(String[] array)
// 将 URL 字元串進行解碼
String uriDecode(String source, Charset charset)           

3. 路徑相關工具方法

// 解析路徑字元串,優化其中的 “..” 
String cleanPath(String path)
// 解析路徑字元串,解析出檔案名部分
String getFilename(String path)
// 解析路徑字元串,解析出檔案字尾名
String getFilenameExtension(String path)
// 比較兩個兩個字元串,判斷是否是同一個路徑。會自動處理路徑中的 “..”
boolean pathEquals(String path1, String path2)
// 删除檔案路徑名中的字尾部分
String stripFilenameExtension(String path)
// 以 “. 作為分隔符,擷取其最後一部分
String unqualify(String qualifiedName)
// 以指定字元作為分隔符,擷取其最後一部分
String unqualify(String qualifiedName, char separator)           

CollectionUtils

1. 集合判斷工具

// 判斷 List/Set 是否為空
boolean isEmpty(Collection<?> collection)
// 判斷 Map 是否為空
boolean isEmpty(Map<?,?> map)
// 判斷 List/Set 中是否包含某個對象
boolean containsInstance(Collection<?> collection, Object element)
// 以疊代器的方式,判斷 List/Set 中是否包含某個對象
boolean contains(Iterator<?> iterator, Object element)
// 判斷 List/Set 是否包含某些對象中的任意一個
boolean containsAny(Collection<?> source, Collection<?> candidates)
// 判斷 List/Set 中的每個元素是否唯一。即 List/Set 中不存在重複元素
boolean hasUniqueObject(Collection<?> collection)           

2. 集合操作工具

// 将 Array 中的元素都添加到 List/Set 中
<E> void mergeArrayIntoCollection(Object array, Collection<E> collection)
// 将 Properties 中的鍵值對都添加到 Map 中
<K,V> void mergePropertiesIntoMap(Properties props, Map<K,V> map)
// 傳回 List 中最後一個元素
<T> T lastElement(List<T> list)
// 傳回 Set 中最後一個元素
<T> T lastElement(Set<T> set)
// 傳回參數 candidates 中第一個存在于參數 source 中的元素
<E> E findFirstMatch(Collection<?> source, Collection<E> candidates)
// 傳回 List/Set 中指定類型的元素。
<T> T findValueOfType(Collection<?> collection, Class<T> type)
// 傳回 List/Set 中指定類型的元素。如果第一種類型未找到,則查找第二種類型,以此類推
Object findValueOfType(Collection<?> collection, Class<?>[] types)
// 傳回 List/Set 中元素的類型
Class<?> findCommonElementType(Collection<?> collection)           

檔案、資源、IO 流

FileCopyUtils

1. 輸入

// 從檔案中讀入到位元組數組中
byte copyToByteArray(File in)
// 從輸入流中讀入到位元組數組中
byte copyToByteArray(InputStream in)
// 從輸入流中讀入到字元串中
String copyToString(Reader in)           

2. 輸出

// 從位元組數組到檔案
void copy(byte[] in, File out)
// 從檔案到檔案
int copy(File in, File out)
// 從位元組數組到輸出流
void copy(byte[] in, OutputStream out)
// 從輸入流到輸出流
int copy(InputStream in, OutputStream out)
// 從輸入流到輸出流
int copy(Reader in, Writer out)
// 從字元串到輸出流
void copy(String in, Writer out)           

ResourceUtils

1. 從資源路徑擷取檔案

// 判斷字元串是否是一個合法的 URL 字元串。
static boolean isUrl(String resourceLocation)
// 擷取 URL
static URL getURL(String resourceLocation)
// 擷取檔案(在 JAR 包内無法正常使用,需要是一個獨立的檔案)
static File getFile(String resourceLocation)           

2. Resource

// 檔案系統資源 D:\...
FileSystemResource
// URL 資源,如 file://... http://...
UrlResource
// 類路徑下的資源,classpth:...
ClassPathResource
// Web 容器上下文中的資源(jar 包、war 包)
ServletContextResource
// 判斷資源是否存在
boolean exists
// 從資源中獲得 File 對象
File getFile
// 從資源中獲得 URI 對象
URI getURI
// 從資源中獲得 URI 對象
URL getURL
// 獲得資源的 InputStream
InputStream getInputStream
// 獲得資源的描述資訊
String getDescription           

StreamUtils

void copy(byte[] in, OutputStream out)
int copy(InputStream in, OutputStream out)
void copy(String in, Charset charset, OutputStream out)
long copyRange(InputStream in, OutputStream out, long start, long end)           
byte copyToByteArray(InputStream in)
String copyToString(InputStream in, Charset charset)
// 舍棄輸入流中的内容
int drain(InputStream in)           

反射、AOP

ReflectionUtils

1. 擷取方法

// 在類中查找指定方法
Method findMethod(Class<?> clazz, String name)
// 同上,額外提供方法參數類型作查找條件
Method findMethod(Class<?> clazz, String name, Class<?>... paramTypes)
// 獲得類中所有方法,包括繼承而來的
Method getAllDeclaredMethods(Class<?> leafClass)
// 在類中查找指定構造方法
Constructor<T> accessibleConstructor(Class<T> clazz, Class<?>... parameterTypes)
// 是否是 equals 方法
boolean isEqualsMethod(Method method)
// 是否是 hashCode 方法
boolean isHashCodeMethod(Method method)
// 是否是 toString 方法
boolean isToStringMethod(Method method)
// 是否是從 Object 類繼承而來的方法
boolean isObjectMethod(Method method)
// 檢查一個方法是否聲明抛出指定異常
boolean declaresException(Method method, Class<?> exceptionType)           

2. 執行方法

// 執行方法
Object invokeMethod(Method method, Object target)
// 同上,提供方法參數
Object invokeMethod(Method method, Object target, Object... args)
// 取消 Java 權限檢查。以便後續執行該私有方法
void makeAccessible(Method method)
// 取消 Java 權限檢查。以便後續執行私有構造方法
void makeAccessible(Constructor<?> ctor)           

3. 擷取字段

// 在類中查找指定屬性
Field findField(Class<?> clazz, String name)
// 同上,多提供了屬性的類型
Field findField(Class<?> clazz, String name, Class<?> type)
// 是否為一個 "public static final" 屬性
boolean isPublicStaticFinal(Field field)           

4. 設定字段

// 擷取 target 對象的 field 屬性值
Object getField(Field field, Object target)
// 設定 target 對象的 field 屬性值,值為 value
void setField(Field field, Object target, Object value)
// 同類對象屬性對等指派
void shallowCopyFieldState(Object src, Object dest)
// 取消 Java 的權限控制檢查。以便後續讀寫該私有屬性
void makeAccessible(Field field)
// 對類的每個屬性執行 callback
void doWithFields(Class<?> clazz, ReflectionUtils.FieldCallback fc)
// 同上,多了個屬性過濾功能。
void doWithFields(Class<?> clazz, ReflectionUtils.FieldCallback fc,
ReflectionUtils.FieldFilter ff)
// 同上,但不包括繼承而來的屬性
void doWithLocalFields(Class<?> clazz, ReflectionUtils.FieldCallback fc)           

AopUtils

1. 判斷代理類型

// 判斷是不是 Spring 代理對象
boolean isAopProxy
// 判斷是不是 jdk 動态代理對象
isJdkDynamicProxy
// 判斷是不是 CGLIB 代理對象
boolean isCglibProxy           

2. 擷取被代理對象的 class

// 擷取被代理的目标 classClass<?> getTargetClass
      

AopContext

1. 擷取目前對象的代理對象

Object currentProxy           

來源:CadeCode | juejin.cn/post/7043403364020781064