mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-07-21 15:09:48 +08:00
fix comment
This commit is contained in:
@@ -44,10 +44,11 @@ public class AnnotationUtil {
|
||||
* 获取指定注解
|
||||
*
|
||||
* @param annotationEle {@link AnnotatedElement},可以是Class、Method、Field、Constructor、ReflectPermission
|
||||
* @param isToCombination 是否为转换为组合注解
|
||||
* @return 注解对象
|
||||
*/
|
||||
public static Annotation[] getAnnotations(AnnotatedElement annotationEle, boolean isCombination) {
|
||||
return (null == annotationEle) ? null : (isCombination ? toCombination(annotationEle) : annotationEle).getAnnotations();
|
||||
public static Annotation[] getAnnotations(AnnotatedElement annotationEle, boolean isToCombination) {
|
||||
return (null == annotationEle) ? null : (isToCombination ? toCombination(annotationEle) : annotationEle).getAnnotations();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -87,7 +87,7 @@ public class BeanUtil {
|
||||
final Method[] methods = clazz.getMethods();
|
||||
for (Method method : methods) {
|
||||
if (method.getParameterTypes().length == 0) {
|
||||
if(method.getName().startsWith("get") || method.getName().startsWith("is")) {
|
||||
if (method.getName().startsWith("get") || method.getName().startsWith("is")) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -160,6 +160,7 @@ public class BeanUtil {
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------- PropertyDescriptor
|
||||
|
||||
/**
|
||||
* 获得Bean字段描述数组
|
||||
*
|
||||
@@ -186,7 +187,7 @@ public class BeanUtil {
|
||||
/**
|
||||
* 获得字段名和字段描述Map,获得的结果会缓存在 {@link BeanInfoCache}中
|
||||
*
|
||||
* @param clazz Bean类
|
||||
* @param clazz Bean类
|
||||
* @param ignoreCase 是否忽略大小写
|
||||
* @return 字段名和字段描述Map
|
||||
* @throws BeanException 获取属性异常
|
||||
@@ -203,7 +204,7 @@ public class BeanUtil {
|
||||
/**
|
||||
* 获得字段名和字段描述Map。内部使用,直接获取Bean类的PropertyDescriptor
|
||||
*
|
||||
* @param clazz Bean类
|
||||
* @param clazz Bean类
|
||||
* @param ignoreCase 是否忽略大小写
|
||||
* @return 字段名和字段描述Map
|
||||
* @throws BeanException 获取属性异常
|
||||
@@ -222,7 +223,7 @@ public class BeanUtil {
|
||||
/**
|
||||
* 获得Bean类属性描述,大小写敏感
|
||||
*
|
||||
* @param clazz Bean类
|
||||
* @param clazz Bean类
|
||||
* @param fieldName 字段名
|
||||
* @return PropertyDescriptor
|
||||
* @throws BeanException 获取属性异常
|
||||
@@ -234,8 +235,8 @@ public class BeanUtil {
|
||||
/**
|
||||
* 获得Bean类属性描述
|
||||
*
|
||||
* @param clazz Bean类
|
||||
* @param fieldName 字段名
|
||||
* @param clazz Bean类
|
||||
* @param fieldName 字段名
|
||||
* @param ignoreCase 是否忽略大小写
|
||||
* @return PropertyDescriptor
|
||||
* @throws BeanException 获取属性异常
|
||||
@@ -249,7 +250,7 @@ public class BeanUtil {
|
||||
* 获得字段值,通过反射直接获得字段值,并不调用getXXX方法<br>
|
||||
* 对象同样支持Map类型,fieldNameOrIndex即为key
|
||||
*
|
||||
* @param bean Bean对象
|
||||
* @param bean Bean对象
|
||||
* @param fieldNameOrIndex 字段名或序号,序号支持负数
|
||||
* @return 字段值
|
||||
*/
|
||||
@@ -273,11 +274,11 @@ public class BeanUtil {
|
||||
* 设置字段值,,通过反射设置字段值,并不调用setXXX方法<br>
|
||||
* 对象同样支持Map类型,fieldNameOrIndex即为key
|
||||
*
|
||||
* @param bean Bean
|
||||
* @param bean Bean
|
||||
* @param fieldNameOrIndex 字段名或序号,序号支持负数
|
||||
* @param value 值
|
||||
* @param value 值
|
||||
*/
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
public static void setFieldValue(Object bean, String fieldNameOrIndex, Object value) {
|
||||
if (bean instanceof Map) {
|
||||
((Map) bean).put(fieldNameOrIndex, value);
|
||||
@@ -294,7 +295,7 @@ public class BeanUtil {
|
||||
/**
|
||||
* 解析Bean中的属性值
|
||||
*
|
||||
* @param bean Bean对象,支持Map、List、Collection、Array
|
||||
* @param bean Bean对象,支持Map、List、Collection、Array
|
||||
* @param expression 表达式,例如:person.friend[5].name
|
||||
* @return Bean属性值
|
||||
* @see BeanPath#get(Object)
|
||||
@@ -307,8 +308,9 @@ public class BeanUtil {
|
||||
/**
|
||||
* 解析Bean中的属性值
|
||||
*
|
||||
* @param bean Bean对象,支持Map、List、Collection、Array
|
||||
* @param bean Bean对象,支持Map、List、Collection、Array
|
||||
* @param expression 表达式,例如:person.friend[5].name
|
||||
* @param value 属性值
|
||||
* @see BeanPath#get(Object)
|
||||
* @since 4.0.6
|
||||
*/
|
||||
@@ -317,12 +319,13 @@ public class BeanUtil {
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------------------- mapToBean
|
||||
|
||||
/**
|
||||
* Map转换为Bean对象
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param map {@link Map}
|
||||
* @param beanClass Bean Class
|
||||
* @param <T> Bean类型
|
||||
* @param map {@link Map}
|
||||
* @param beanClass Bean Class
|
||||
* @param isIgnoreError 是否忽略注入错误
|
||||
* @return Bean
|
||||
*/
|
||||
@@ -334,9 +337,9 @@ public class BeanUtil {
|
||||
* Map转换为Bean对象<br>
|
||||
* 忽略大小写
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param beanClass Bean Class
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param beanClass Bean Class
|
||||
* @param isIgnoreError 是否忽略注入错误
|
||||
* @return Bean
|
||||
*/
|
||||
@@ -347,9 +350,9 @@ public class BeanUtil {
|
||||
/**
|
||||
* Map转换为Bean对象
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param map {@link Map}
|
||||
* @param beanClass Bean Class
|
||||
* @param <T> Bean类型
|
||||
* @param map {@link Map}
|
||||
* @param beanClass Bean Class
|
||||
* @param copyOptions 转Bean选项
|
||||
* @return Bean
|
||||
*/
|
||||
@@ -358,12 +361,13 @@ public class BeanUtil {
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------------------- fillBeanWithMap
|
||||
|
||||
/**
|
||||
* 使用Map填充Bean对象
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param isIgnoreError 是否忽略注入错误
|
||||
* @return Bean
|
||||
*/
|
||||
@@ -374,9 +378,9 @@ public class BeanUtil {
|
||||
/**
|
||||
* 使用Map填充Bean对象,可配置将下划线转换为驼峰
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param isToCamelCase 是否将下划线模式转换为驼峰模式
|
||||
* @param isIgnoreError 是否忽略注入错误
|
||||
* @return Bean
|
||||
@@ -388,9 +392,9 @@ public class BeanUtil {
|
||||
/**
|
||||
* 使用Map填充Bean对象,忽略大小写
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param isIgnoreError 是否忽略注入错误
|
||||
* @return Bean
|
||||
*/
|
||||
@@ -401,9 +405,9 @@ public class BeanUtil {
|
||||
/**
|
||||
* 使用Map填充Bean对象
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param copyOptions 属性复制选项 {@link CopyOptions}
|
||||
* @return Bean
|
||||
*/
|
||||
@@ -414,11 +418,11 @@ public class BeanUtil {
|
||||
/**
|
||||
* 使用Map填充Bean对象
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param isToCamelCase 是否将Map中的下划线风格key转换为驼峰风格
|
||||
* @param copyOptions 属性复制选项 {@link CopyOptions}
|
||||
* @param copyOptions 属性复制选项 {@link CopyOptions}
|
||||
* @return Bean
|
||||
* @since 3.3.1
|
||||
*/
|
||||
@@ -433,11 +437,13 @@ public class BeanUtil {
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------------------- fillBean
|
||||
|
||||
/**
|
||||
* 对象或Map转Bean
|
||||
*
|
||||
* @param <T> 转换的Bean类型
|
||||
* @param source Bean对象或Map
|
||||
* @param clazz 目标的Bean类型
|
||||
* @param clazz 目标的Bean类型
|
||||
* @return Bean对象
|
||||
* @since 4.1.20
|
||||
*/
|
||||
@@ -450,10 +456,10 @@ public class BeanUtil {
|
||||
/**
|
||||
* ServletRequest 参数转Bean
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param beanClass Bean Class
|
||||
* @param <T> Bean类型
|
||||
* @param beanClass Bean Class
|
||||
* @param valueProvider 值提供者
|
||||
* @param copyOptions 拷贝选项,见 {@link CopyOptions}
|
||||
* @param copyOptions 拷贝选项,见 {@link CopyOptions}
|
||||
* @return Bean
|
||||
*/
|
||||
public static <T> T toBean(Class<T> beanClass, ValueProvider<String> valueProvider, CopyOptions copyOptions) {
|
||||
@@ -463,10 +469,10 @@ public class BeanUtil {
|
||||
/**
|
||||
* 填充Bean的核心方法
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param bean Bean
|
||||
* @param <T> Bean类型
|
||||
* @param bean Bean
|
||||
* @param valueProvider 值提供者
|
||||
* @param copyOptions 拷贝选项,见 {@link CopyOptions}
|
||||
* @param copyOptions 拷贝选项,见 {@link CopyOptions}
|
||||
* @return Bean
|
||||
*/
|
||||
public static <T> T fillBean(T bean, ValueProvider<String> valueProvider, CopyOptions copyOptions) {
|
||||
@@ -478,6 +484,7 @@ public class BeanUtil {
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------------------- beanToMap
|
||||
|
||||
/**
|
||||
* 对象转Map,不进行驼峰转下划线,不忽略值为空的字段
|
||||
*
|
||||
@@ -491,22 +498,22 @@ public class BeanUtil {
|
||||
/**
|
||||
* 对象转Map
|
||||
*
|
||||
* @param bean bean对象
|
||||
* @param bean bean对象
|
||||
* @param isToUnderlineCase 是否转换为下划线模式
|
||||
* @param ignoreNullValue 是否忽略值为空的字段
|
||||
* @param ignoreNullValue 是否忽略值为空的字段
|
||||
* @return Map
|
||||
*/
|
||||
public static Map<String, Object> beanToMap(Object bean, boolean isToUnderlineCase, boolean ignoreNullValue) {
|
||||
return beanToMap(bean, new LinkedHashMap<String, Object>(), isToUnderlineCase, ignoreNullValue);
|
||||
return beanToMap(bean, new LinkedHashMap<>(), isToUnderlineCase, ignoreNullValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* 对象转Map
|
||||
*
|
||||
* @param bean bean对象
|
||||
* @param targetMap 目标的Map
|
||||
* @param bean bean对象
|
||||
* @param targetMap 目标的Map
|
||||
* @param isToUnderlineCase 是否转换为下划线模式
|
||||
* @param ignoreNullValue 是否忽略值为空的字段
|
||||
* @param ignoreNullValue 是否忽略值为空的字段
|
||||
* @return Map
|
||||
* @since 3.2.3
|
||||
*/
|
||||
@@ -534,10 +541,10 @@ public class BeanUtil {
|
||||
* 3. 自定义字段前缀或后缀等等
|
||||
* </pre>
|
||||
*
|
||||
* @param bean bean对象
|
||||
* @param targetMap 目标的Map
|
||||
* @param bean bean对象
|
||||
* @param targetMap 目标的Map
|
||||
* @param ignoreNullValue 是否忽略值为空的字段
|
||||
* @param keyEditor 属性字段(Map的key)编辑器,用于筛选、编辑key
|
||||
* @param keyEditor 属性字段(Map的key)编辑器,用于筛选、编辑key
|
||||
* @return Map
|
||||
* @since 4.0.5
|
||||
*/
|
||||
@@ -575,6 +582,7 @@ public class BeanUtil {
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------------------- copyProperties
|
||||
|
||||
/**
|
||||
* 复制Bean对象属性
|
||||
*
|
||||
@@ -589,8 +597,8 @@ public class BeanUtil {
|
||||
* 复制Bean对象属性<br>
|
||||
* 限制类用于限制拷贝的属性,例如一个类我只想复制其父类的一些属性,就可以将editable设置为父类
|
||||
*
|
||||
* @param source 源Bean对象
|
||||
* @param target 目标Bean对象
|
||||
* @param source 源Bean对象
|
||||
* @param target 目标Bean对象
|
||||
* @param ignoreProperties 不拷贝的的属性列表
|
||||
*/
|
||||
public static void copyProperties(Object source, Object target, String... ignoreProperties) {
|
||||
@@ -600,8 +608,8 @@ public class BeanUtil {
|
||||
/**
|
||||
* 复制Bean对象属性<br>
|
||||
*
|
||||
* @param source 源Bean对象
|
||||
* @param target 目标Bean对象
|
||||
* @param source 源Bean对象
|
||||
* @param target 目标Bean对象
|
||||
* @param ignoreCase 是否忽略大小写
|
||||
*/
|
||||
public static void copyProperties(Object source, Object target, boolean ignoreCase) {
|
||||
@@ -612,8 +620,8 @@ public class BeanUtil {
|
||||
* 复制Bean对象属性<br>
|
||||
* 限制类用于限制拷贝的属性,例如一个类我只想复制其父类的一些属性,就可以将editable设置为父类
|
||||
*
|
||||
* @param source 源Bean对象
|
||||
* @param target 目标Bean对象
|
||||
* @param source 源Bean对象
|
||||
* @param target 目标Bean对象
|
||||
* @param copyOptions 拷贝选项,见 {@link CopyOptions}
|
||||
*/
|
||||
public static void copyProperties(Object source, Object target, CopyOptions copyOptions) {
|
||||
@@ -628,9 +636,9 @@ public class BeanUtil {
|
||||
* 如果isSimple为{@code false},则只匹配类名而忽略包名,例如:cn.hutool.TestEntity只匹配TestEntity<br>
|
||||
* 如果isSimple为{@code true},则匹配包括包名的全类名,例如:cn.hutool.TestEntity匹配cn.hutool.TestEntity
|
||||
*
|
||||
* @param bean Bean
|
||||
* @param bean Bean
|
||||
* @param beanClassName Bean的类名
|
||||
* @param isSimple 是否只匹配类名而忽略包名,true表示忽略包名
|
||||
* @param isSimple 是否只匹配类名而忽略包名,true表示忽略包名
|
||||
* @return 是否匹配
|
||||
* @since 4.0.6
|
||||
*/
|
||||
@@ -639,13 +647,14 @@ public class BeanUtil {
|
||||
}
|
||||
|
||||
/**
|
||||
* 把Bean里面的String属性做trim操作。
|
||||
*
|
||||
* 把Bean里面的String属性做trim操作。此方法直接对传入的Bean做修改。
|
||||
* <p>
|
||||
* 通常bean直接用来绑定页面的input,用户的输入可能首尾存在空格,通常保存数据库前需要把首尾空格去掉
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param bean Bean对象
|
||||
* @param <T> Bean类型
|
||||
* @param bean Bean对象
|
||||
* @param ignoreFields 不需要trim的Field名称列表(不区分大小写)
|
||||
* @return 处理后的Bean对象
|
||||
*/
|
||||
public static <T> T trimStrFields(T bean, String... ignoreFields) {
|
||||
if (bean == null) {
|
||||
|
@@ -3,9 +3,8 @@ package cn.hutool.core.codec;
|
||||
/**
|
||||
* 凯撒密码实现<br>
|
||||
* 算法来自:https://github.com/zhaorenjie110/SymmetricEncryptionAndDecryption
|
||||
*
|
||||
* @author looly
|
||||
*
|
||||
* @author looly
|
||||
*/
|
||||
public class Caesar {
|
||||
|
||||
@@ -16,7 +15,7 @@ public class Caesar {
|
||||
* 传入明文,加密得到密文
|
||||
*
|
||||
* @param message 加密的消息
|
||||
* @param offset 偏移量
|
||||
* @param offset 偏移量
|
||||
* @return 加密后的内容
|
||||
*/
|
||||
public static String encode(String message, int offset) {
|
||||
@@ -36,15 +35,16 @@ public class Caesar {
|
||||
/**
|
||||
* 传入明文解密到密文
|
||||
*
|
||||
* @param ciphertext 密文
|
||||
* @param cipherText 密文
|
||||
* @param offset 偏移量
|
||||
* @return 解密后的内容
|
||||
*/
|
||||
public static String decode(String ciphertext, int offset) {
|
||||
final int len = ciphertext.length();
|
||||
final char[] plain = ciphertext.toCharArray();
|
||||
public static String decode(String cipherText, int offset) {
|
||||
final int len = cipherText.length();
|
||||
final char[] plain = cipherText.toCharArray();
|
||||
char c;
|
||||
for (int i = 0; i < len; i++) {
|
||||
c = ciphertext.charAt(i);
|
||||
c = cipherText.charAt(i);
|
||||
if (false == Character.isLetter(c)) {
|
||||
continue;
|
||||
}
|
||||
@@ -54,10 +54,11 @@ public class Caesar {
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------- Private method start
|
||||
|
||||
/**
|
||||
* 加密轮盘
|
||||
*
|
||||
* @param c 被加密字符
|
||||
*
|
||||
* @param c 被加密字符
|
||||
* @param offset 偏移量
|
||||
* @return 加密后的字符
|
||||
*/
|
||||
@@ -69,7 +70,7 @@ public class Caesar {
|
||||
|
||||
/**
|
||||
* 解密轮盘
|
||||
*
|
||||
*
|
||||
* @param c 字符
|
||||
* @return 解密后的字符
|
||||
*/
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,13 +1,38 @@
|
||||
package cn.hutool.core.comparator;
|
||||
|
||||
import java.util.Comparator;
|
||||
|
||||
public class CompareUtil {
|
||||
|
||||
|
||||
/**
|
||||
* 对象比较,比较结果取决于comparator,如果被比较对象为null,传入的comparator对象应处理此情况<br>
|
||||
* 如果传入comparator为null,则使用默认规则比较(此时被比较对象必须实现Comparable接口)
|
||||
*
|
||||
* <p>
|
||||
* 一般而言,如果c1 < c2,返回数小于0,c1==c2返回0,c1 > c2 大于0
|
||||
*
|
||||
* @param <T> 被比较对象类型
|
||||
* @param c1 对象1
|
||||
* @param c2 对象2
|
||||
* @param comparator 比较器
|
||||
* @return 比较结果
|
||||
* @see java.util.Comparator#compare(Object, Object)
|
||||
* @since 4.6.9
|
||||
*/
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static <T> int compare(T c1, T c2, Comparator<T> comparator) {
|
||||
if (null == comparator) {
|
||||
return compare((Comparable)c1, (Comparable)c2);
|
||||
}
|
||||
return comparator.compare(c1, c2);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@code null}安全的对象比较,{@code null}对象小于任何对象
|
||||
*
|
||||
*
|
||||
* @param <T> 被比较对象类型
|
||||
* @param c1 对象1,可以为{@code null}
|
||||
* @param c2 对象2,可以为{@code null}
|
||||
* @param c1 对象1,可以为{@code null}
|
||||
* @param c2 对象2,可以为{@code null}
|
||||
* @return 比较结果,如果c1 < c2,返回数小于0,c1==c2返回0,c1 > c2 大于0
|
||||
* @see java.util.Comparator#compare(Object, Object)
|
||||
*/
|
||||
@@ -17,10 +42,10 @@ public class CompareUtil {
|
||||
|
||||
/**
|
||||
* {@code null}安全的对象比较
|
||||
*
|
||||
* @param <T> 被比较对象类型(必须实现Comparable接口)
|
||||
* @param c1 对象1,可以为{@code null}
|
||||
* @param c2 对象2,可以为{@code null}
|
||||
*
|
||||
* @param <T> 被比较对象类型(必须实现Comparable接口)
|
||||
* @param c1 对象1,可以为{@code null}
|
||||
* @param c2 对象2,可以为{@code null}
|
||||
* @param isNullGreater 当被比较对象为null时是否排在前面,true表示null大于任何对象,false反之
|
||||
* @return 比较结果,如果c1 < c2,返回数小于0,c1==c2返回0,c1 > c2 大于0
|
||||
* @see java.util.Comparator#compare(Object, Object)
|
||||
@@ -35,23 +60,24 @@ public class CompareUtil {
|
||||
}
|
||||
return c1.compareTo(c2);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 自然比较两个对象的大小,比较规则如下:
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* 1、如果实现Comparable调用compareTo比较
|
||||
* 2、o1.equals(o2)返回0
|
||||
* 3、比较hashCode值
|
||||
* 4、比较toString值
|
||||
* </pre>
|
||||
*
|
||||
* @param o1 对象1
|
||||
* @param o2 对象2
|
||||
*
|
||||
* @param <T> 被比较对象类型
|
||||
* @param o1 对象1
|
||||
* @param o2 对象2
|
||||
* @param isNullGreater null值是否做为最大值
|
||||
* @return 比较结果,如果o1 < o2,返回数小于0,o1==o2返回0,o1 > o2 大于0
|
||||
*/
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
public static <T> int compare(T o1, T o2, boolean isNullGreater) {
|
||||
if (o1 == o2) {
|
||||
return 0;
|
||||
@@ -60,21 +86,21 @@ public class CompareUtil {
|
||||
} else if (null == o2) {
|
||||
return isNullGreater ? -1 : 1;
|
||||
}
|
||||
|
||||
if(o1 instanceof Comparable && o2 instanceof Comparable) {
|
||||
|
||||
if (o1 instanceof Comparable && o2 instanceof Comparable) {
|
||||
//如果bean可比较,直接比较bean
|
||||
return ((Comparable)o1).compareTo(o2);
|
||||
return ((Comparable) o1).compareTo(o2);
|
||||
}
|
||||
|
||||
if(o1.equals(o2)) {
|
||||
|
||||
if (o1.equals(o2)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int result = Integer.compare(o1.hashCode(), o2.hashCode());
|
||||
if(0 == result) {
|
||||
if (0 == result) {
|
||||
result = compare(o1.toString(), o2.toString());
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
@@ -62,7 +62,7 @@ public class PropertyComparator<T> implements Comparator<T>, Serializable {
|
||||
return compare(o1, o2, v1, v2);
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@SuppressWarnings({ "rawtypes"})
|
||||
private int compare(T o1, T o2, Comparable fieldValue1, Comparable fieldValue2) {
|
||||
int result = ObjectUtil.compare(fieldValue1, fieldValue2, isNullGreater);
|
||||
if(0 == result) {
|
||||
|
@@ -528,6 +528,8 @@ public class Convert {
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param keyType 键类型
|
||||
* @param valueType 值类型
|
||||
* @param value 被转换的值
|
||||
* @return {@link Map}
|
||||
* @since 4.6.8
|
||||
|
@@ -366,7 +366,9 @@ public class StopWatch {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取任务名Get the name of this task.
|
||||
* 获取任务名
|
||||
*
|
||||
* @return 任务名
|
||||
*/
|
||||
public String getTaskName() {
|
||||
return this.taskName;
|
||||
@@ -375,6 +377,7 @@ public class StopWatch {
|
||||
/**
|
||||
* 获取任务花费时间(单位:纳秒)
|
||||
*
|
||||
* @return 任务花费时间(单位:纳秒)
|
||||
* @see #getTimeMillis()
|
||||
* @see #getTimeSeconds()
|
||||
*/
|
||||
@@ -385,6 +388,7 @@ public class StopWatch {
|
||||
/**
|
||||
* 获取任务花费时间(单位:毫秒)
|
||||
*
|
||||
* @return 任务花费时间(单位:毫秒)
|
||||
* @see #getTimeNanos()
|
||||
* @see #getTimeSeconds()
|
||||
*/
|
||||
@@ -395,6 +399,7 @@ public class StopWatch {
|
||||
/**
|
||||
* 获取任务花费时间(单位:秒)
|
||||
*
|
||||
* @return 任务花费时间(单位:秒)
|
||||
* @see #getTimeMillis()
|
||||
* @see #getTimeNanos()
|
||||
*/
|
||||
|
@@ -62,7 +62,8 @@ public class ExceptionUtil {
|
||||
|
||||
/**
|
||||
* 包装一个异常
|
||||
*
|
||||
*
|
||||
* @param <T> 被包装的异常类型
|
||||
* @param throwable 异常
|
||||
* @param wrapThrowable 包装后的异常类
|
||||
* @return 包装后的异常
|
||||
@@ -123,7 +124,8 @@ public class ExceptionUtil {
|
||||
|
||||
/**
|
||||
* 获取指定层的堆栈信息
|
||||
*
|
||||
*
|
||||
* @param i 层数
|
||||
* @return 指定层的堆栈信息
|
||||
* @since 4.1.4
|
||||
*/
|
||||
@@ -346,7 +348,7 @@ public class ExceptionUtil {
|
||||
* @since 4.6.2
|
||||
*/
|
||||
public static List<Throwable> getThrowableList(Throwable throwable) {
|
||||
final List<Throwable> list = new ArrayList<Throwable>();
|
||||
final List<Throwable> list = new ArrayList<>();
|
||||
while (throwable != null && false == list.contains(throwable)) {
|
||||
list.add(throwable);
|
||||
throwable = throwable.getCause();
|
||||
|
@@ -41,25 +41,31 @@ import cn.hutool.core.util.StrUtil;
|
||||
|
||||
/**
|
||||
* 图像编辑器
|
||||
*
|
||||
*
|
||||
* @author looly
|
||||
* @since 4.1.5
|
||||
*/
|
||||
public class Img implements Serializable{
|
||||
public class Img implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private BufferedImage srcImage;
|
||||
private Image targetImage;
|
||||
/** 目标图片文件格式,用于写出 */
|
||||
/**
|
||||
* 目标图片文件格式,用于写出
|
||||
*/
|
||||
private String targetImageType = ImgUtil.IMAGE_TYPE_JPG;
|
||||
/** 计算x,y坐标的时候是否从中心做为原始坐标开始计算 */
|
||||
/**
|
||||
* 计算x,y坐标的时候是否从中心做为原始坐标开始计算
|
||||
*/
|
||||
private boolean positionBaseCentre = true;
|
||||
/** 图片输出质量,用于压缩 */
|
||||
/**
|
||||
* 图片输出质量,用于压缩
|
||||
*/
|
||||
private float quality = -1;
|
||||
|
||||
/**
|
||||
* 从Path读取图片并开始处理
|
||||
*
|
||||
*
|
||||
* @param imagePath 图片文件路径
|
||||
* @return {@link Img}
|
||||
*/
|
||||
@@ -69,7 +75,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 从文件读取图片并开始处理
|
||||
*
|
||||
*
|
||||
* @param imageFile 图片文件
|
||||
* @return {@link Img}
|
||||
*/
|
||||
@@ -79,7 +85,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 从资源对象中读取图片并开始处理
|
||||
*
|
||||
*
|
||||
* @param resource 图片资源对象
|
||||
* @return {@link Img}
|
||||
* @since 4.4.1
|
||||
@@ -90,7 +96,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 从流读取图片并开始处理
|
||||
*
|
||||
*
|
||||
* @param in 图片流
|
||||
* @return {@link Img}
|
||||
*/
|
||||
@@ -100,7 +106,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 从ImageInputStream取图片并开始处理
|
||||
*
|
||||
*
|
||||
* @param imageStream 图片流
|
||||
* @return {@link Img}
|
||||
*/
|
||||
@@ -110,7 +116,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 从URL取图片并开始处理
|
||||
*
|
||||
*
|
||||
* @param imageUrl 图片URL
|
||||
* @return {@link Img}
|
||||
*/
|
||||
@@ -120,7 +126,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 从Image取图片并开始处理
|
||||
*
|
||||
*
|
||||
* @param image 图片
|
||||
* @return {@link Img}
|
||||
*/
|
||||
@@ -130,7 +136,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
*
|
||||
* @param srcImage 来源图片
|
||||
*/
|
||||
public Img(BufferedImage srcImage) {
|
||||
@@ -139,7 +145,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 设置目标图片文件格式,用于写出
|
||||
*
|
||||
*
|
||||
* @param imgType 图片格式
|
||||
* @return this
|
||||
* @see ImgUtil#IMAGE_TYPE_JPG
|
||||
@@ -152,8 +158,9 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 计算x,y坐标的时候是否从中心做为原始坐标开始计算
|
||||
*
|
||||
*
|
||||
* @param positionBaseCentre 是否从中心做为原始坐标开始计算
|
||||
* @return this
|
||||
* @since 4.1.15
|
||||
*/
|
||||
public Img setPositionBaseCentre(boolean positionBaseCentre) {
|
||||
@@ -163,8 +170,9 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 设置图片输出质量,数字为0~1(不包括0和1)表示质量压缩比,除此数字外设置表示不压缩
|
||||
*
|
||||
*
|
||||
* @param quality 质量,数字为0~1(不包括0和1)表示质量压缩比,除此数字外设置表示不压缩
|
||||
* @return this
|
||||
* @since 4.3.2
|
||||
*/
|
||||
public Img setQuality(double quality) {
|
||||
@@ -173,8 +181,9 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 设置图片输出质量,数字为0~1(不包括0和1)表示质量压缩比,除此数字外设置表示不压缩
|
||||
*
|
||||
*
|
||||
* @param quality 质量,数字为0~1(不包括0和1)表示质量压缩比,除此数字外设置表示不压缩
|
||||
* @return this
|
||||
* @since 4.3.2
|
||||
*/
|
||||
public Img setQuality(float quality) {
|
||||
@@ -188,7 +197,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 缩放图像(按比例缩放)
|
||||
*
|
||||
*
|
||||
* @param scale 缩放比例。比例大于1时为放大,小于1大于0为缩小
|
||||
* @return this
|
||||
*/
|
||||
@@ -218,8 +227,8 @@ public class Img implements Serializable{
|
||||
/**
|
||||
* 缩放图像(按长宽缩放)<br>
|
||||
* 注意:目标长宽与原图不成比例会变形
|
||||
*
|
||||
* @param width 目标宽度
|
||||
*
|
||||
* @param width 目标宽度
|
||||
* @param height 目标高度
|
||||
* @return this
|
||||
*/
|
||||
@@ -239,7 +248,7 @@ public class Img implements Serializable{
|
||||
} else {
|
||||
scaleType = Image.SCALE_DEFAULT;
|
||||
}
|
||||
|
||||
|
||||
double sx = NumberUtil.div(width, srcWidth);
|
||||
double sy = NumberUtil.div(height, srcHeight);
|
||||
|
||||
@@ -256,9 +265,9 @@ public class Img implements Serializable{
|
||||
/**
|
||||
* 等比缩放图像,此方法按照按照给定的长宽等比缩放图片,按照长宽缩放比最多的一边等比缩放,空白部分填充背景色<br>
|
||||
* 缩放后默认为jpeg格式
|
||||
*
|
||||
* @param width 缩放后的宽度
|
||||
* @param height 缩放后的高度
|
||||
*
|
||||
* @param width 缩放后的宽度
|
||||
* @param height 缩放后的高度
|
||||
* @param fixedColor 比例不对时补充的颜色,不补充为<code>null</code>
|
||||
* @return this
|
||||
*/
|
||||
@@ -279,7 +288,7 @@ public class Img implements Serializable{
|
||||
} else {
|
||||
scale((int) (srcWidth * heightRatio), height);
|
||||
}
|
||||
|
||||
|
||||
// 获取缩放后的新的宽和高
|
||||
srcImage = getValidSrcImg();
|
||||
srcHeight = srcImage.getHeight(null);
|
||||
@@ -305,7 +314,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 图像切割(按指定起点坐标和宽高切割)
|
||||
*
|
||||
*
|
||||
* @param rectangle 矩形对象,表示矩形区域的x,y,width,height
|
||||
* @return this
|
||||
*/
|
||||
@@ -321,7 +330,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 图像切割为圆形(按指定起点坐标和半径切割),填充满整个图片(直径取长宽最小值)
|
||||
*
|
||||
*
|
||||
* @param x 原图的x坐标起始位置
|
||||
* @param y 原图的y坐标起始位置
|
||||
* @return this
|
||||
@@ -333,9 +342,9 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 图像切割为圆形(按指定起点坐标和半径切割)
|
||||
*
|
||||
* @param x 原图的x坐标起始位置
|
||||
* @param y 原图的y坐标起始位置
|
||||
*
|
||||
* @param x 原图的x坐标起始位置
|
||||
* @param y 原图的y坐标起始位置
|
||||
* @param radius 半径,小于0表示填充满整个图片(直径取长宽最小值)
|
||||
* @return this
|
||||
* @since 4.1.15
|
||||
@@ -363,7 +372,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 图片圆角处理
|
||||
*
|
||||
*
|
||||
* @param arc 圆角弧度,0~1,为长宽占比
|
||||
* @return this
|
||||
* @since 4.5.3
|
||||
@@ -391,7 +400,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 彩色转为黑白
|
||||
*
|
||||
*
|
||||
* @return this
|
||||
*/
|
||||
public Img gray() {
|
||||
@@ -402,7 +411,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 彩色转为黑白二值化图片
|
||||
*
|
||||
*
|
||||
* @return this
|
||||
*/
|
||||
public Img binary() {
|
||||
@@ -413,13 +422,13 @@ public class Img implements Serializable{
|
||||
/**
|
||||
* 给图片添加文字水印<br>
|
||||
* 此方法并不关闭流
|
||||
*
|
||||
*
|
||||
* @param pressText 水印文字
|
||||
* @param color 水印的字体颜色
|
||||
* @param font {@link Font} 字体相关信息
|
||||
* @param x 修正值。 默认在中间,偏移量相对于中间偏移
|
||||
* @param y 修正值。 默认在中间,偏移量相对于中间偏移
|
||||
* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
|
||||
* @param color 水印的字体颜色
|
||||
* @param font {@link Font} 字体相关信息
|
||||
* @param x 修正值。 默认在中间,偏移量相对于中间偏移
|
||||
* @param y 修正值。 默认在中间,偏移量相对于中间偏移
|
||||
* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
|
||||
* @return 处理后的图像
|
||||
*/
|
||||
public Img pressText(String pressText, Color color, Font font, int x, int y, float alpha) {
|
||||
@@ -450,11 +459,11 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 给图片添加图片水印
|
||||
*
|
||||
*
|
||||
* @param pressImg 水印图片,可以使用{@link ImageIO#read(File)}方法读取文件
|
||||
* @param x 修正值。 默认在中间,偏移量相对于中间偏移
|
||||
* @param y 修正值。 默认在中间,偏移量相对于中间偏移
|
||||
* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
|
||||
* @param x 修正值。 默认在中间,偏移量相对于中间偏移
|
||||
* @param y 修正值。 默认在中间,偏移量相对于中间偏移
|
||||
* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
|
||||
* @return this
|
||||
*/
|
||||
public Img pressImage(Image pressImg, int x, int y, float alpha) {
|
||||
@@ -466,10 +475,10 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 给图片添加图片水印
|
||||
*
|
||||
* @param pressImg 水印图片,可以使用{@link ImageIO#read(File)}方法读取文件
|
||||
*
|
||||
* @param pressImg 水印图片,可以使用{@link ImageIO#read(File)}方法读取文件
|
||||
* @param rectangle 矩形对象,表示矩形区域的x,y,width,height,x,y从背景图片中心计算
|
||||
* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
|
||||
* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
|
||||
* @return this
|
||||
* @since 4.1.14
|
||||
*/
|
||||
@@ -484,7 +493,7 @@ public class Img implements Serializable{
|
||||
/**
|
||||
* 旋转图片为指定角度<br>
|
||||
* 来自:http://blog.51cto.com/cping1982/130066
|
||||
*
|
||||
*
|
||||
* @param degree 旋转角度
|
||||
* @return 旋转后的图片
|
||||
* @since 3.2.2
|
||||
@@ -509,7 +518,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 水平翻转图像
|
||||
*
|
||||
*
|
||||
* @return this
|
||||
*/
|
||||
public Img flip() {
|
||||
@@ -525,9 +534,10 @@ public class Img implements Serializable{
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------------------------------- Write
|
||||
|
||||
/**
|
||||
* 获取处理过的图片
|
||||
*
|
||||
*
|
||||
* @return 处理过的图片
|
||||
*/
|
||||
public Image getImg() {
|
||||
@@ -536,7 +546,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 写出图像
|
||||
*
|
||||
*
|
||||
* @param out 写出到的目标流
|
||||
* @return 是否成功写出,如果返回false表示未找到合适的Writer
|
||||
* @throws IORuntimeException IO异常
|
||||
@@ -547,7 +557,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 写出图像为PNG格式
|
||||
*
|
||||
*
|
||||
* @param targetImageStream 写出到的目标流
|
||||
* @return 是否成功写出,如果返回false表示未找到合适的Writer
|
||||
* @throws IORuntimeException IO异常
|
||||
@@ -564,7 +574,7 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 写出图像为目标文件扩展名对应的格式
|
||||
*
|
||||
*
|
||||
* @param targetFile 目标文件
|
||||
* @return 是否成功写出,如果返回false表示未找到合适的Writer
|
||||
* @throws IORuntimeException IO异常
|
||||
@@ -589,12 +599,13 @@ public class Img implements Serializable{
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------------------------- Private method start
|
||||
|
||||
/**
|
||||
* 将图片绘制在背景上
|
||||
*
|
||||
*
|
||||
* @param backgroundImg 背景图片
|
||||
* @param img 要绘制的图片
|
||||
* @param rectangle 矩形对象,表示矩形区域的x,y,width,height,x,y从背景图片中心计算
|
||||
* @param img 要绘制的图片
|
||||
* @param rectangle 矩形对象,表示矩形区域的x,y,width,height,x,y从背景图片中心计算
|
||||
* @return 绘制后的背景
|
||||
*/
|
||||
private static BufferedImage draw(BufferedImage backgroundImg, Image img, Rectangle rectangle, float alpha) {
|
||||
@@ -607,23 +618,23 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 获取int类型的图片类型
|
||||
*
|
||||
*
|
||||
* @return 图片类型
|
||||
* @see BufferedImage#TYPE_INT_ARGB
|
||||
* @see BufferedImage#TYPE_INT_RGB
|
||||
*/
|
||||
private int getTypeInt() {
|
||||
switch (this.targetImageType) {
|
||||
case ImgUtil.IMAGE_TYPE_PNG:
|
||||
return BufferedImage.TYPE_INT_ARGB;
|
||||
default:
|
||||
return BufferedImage.TYPE_INT_RGB;
|
||||
case ImgUtil.IMAGE_TYPE_PNG:
|
||||
return BufferedImage.TYPE_INT_ARGB;
|
||||
default:
|
||||
return BufferedImage.TYPE_INT_RGB;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取有效的源图片,首先检查上一次处理的结果图片,如无则使用用户传入的源图片
|
||||
*
|
||||
*
|
||||
* @return 有效的源图片
|
||||
*/
|
||||
private Image getValidSrcImg() {
|
||||
@@ -632,9 +643,9 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 修正矩形框位置,如果{@link Img#setPositionBaseCentre(boolean)} 设为{@code true},则坐标修正为基于图形中心,否则基于左上角
|
||||
*
|
||||
* @param rectangle 矩形
|
||||
* @param baseWidth 参考宽
|
||||
*
|
||||
* @param rectangle 矩形
|
||||
* @param baseWidth 参考宽
|
||||
* @param baseHeight 参考高
|
||||
* @return 修正后的{@link Rectangle}
|
||||
* @since 4.1.15
|
||||
@@ -652,17 +663,17 @@ public class Img implements Serializable{
|
||||
|
||||
/**
|
||||
* 计算旋转后的图片尺寸
|
||||
*
|
||||
* @param width 宽度
|
||||
*
|
||||
* @param width 宽度
|
||||
* @param height 高度
|
||||
* @param degree 旋转角度
|
||||
* @return 计算后目标尺寸
|
||||
* @since 4.1.20
|
||||
*/
|
||||
private static Rectangle calcRotatedSize(int width, int height, int degree) {
|
||||
if(degree < 0){
|
||||
if (degree < 0) {
|
||||
// 负数角度转换为正数角度
|
||||
degree += 360;
|
||||
degree += 360;
|
||||
}
|
||||
if (degree >= 90) {
|
||||
if (degree / 90 % 2 == 1) {
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -364,7 +364,7 @@ public class FileUtil {
|
||||
* 此方法会检查slip漏洞,漏洞说明见http://blog.nsfocus.net/zip-slip-2/
|
||||
*
|
||||
* @param directory 父目录
|
||||
* @param names 元素名(多层目录名)
|
||||
* @param names 元素名(多层目录名),由外到内依次传入
|
||||
* @return the file 文件
|
||||
* @since 4.0.6
|
||||
*/
|
||||
@@ -388,6 +388,7 @@ public class FileUtil {
|
||||
* <p>
|
||||
* 元素名(多层目录名)
|
||||
*
|
||||
* @param names 多层文件的文件名,由外到内依次传入
|
||||
* @return the file 文件
|
||||
* @since 4.0.6
|
||||
*/
|
||||
@@ -1397,6 +1398,7 @@ public class FileUtil {
|
||||
* @param file1 文件1
|
||||
* @param file2 文件2
|
||||
* @param charset 编码,null表示使用平台默认编码 两个文件内容一致返回true,否则false
|
||||
* @return 是否相同
|
||||
* @throws IORuntimeException IO异常
|
||||
* @since 4.0.6
|
||||
*/
|
||||
@@ -1550,7 +1552,7 @@ public class FileUtil {
|
||||
// 统一使用斜杠
|
||||
pathToUse = pathToUse.replaceAll("[/\\\\]+", StrUtil.SLASH).trim();
|
||||
//兼容Windows下的共享目录路径(原始路径如果以\\开头,则保留这种路径)
|
||||
if(path.startsWith("\\\\")){
|
||||
if (path.startsWith("\\\\")) {
|
||||
pathToUse = "\\" + pathToUse;
|
||||
}
|
||||
|
||||
@@ -3354,10 +3356,10 @@ public class FileUtil {
|
||||
* 获取指定层级的父路径
|
||||
*
|
||||
* <pre>
|
||||
* getParent("d:/aaa/bbb/cc/ddd", 0) -> "d:/aaa/bbb/cc/ddd"
|
||||
* getParent("d:/aaa/bbb/cc/ddd", 2) -> "d:/aaa/bbb"
|
||||
* getParent("d:/aaa/bbb/cc/ddd", 4) -> "d:/"
|
||||
* getParent("d:/aaa/bbb/cc/ddd", 5) -> null
|
||||
* getParent("d:/aaa/bbb/cc/ddd", 0) -》 "d:/aaa/bbb/cc/ddd"
|
||||
* getParent("d:/aaa/bbb/cc/ddd", 2) -》 "d:/aaa/bbb"
|
||||
* getParent("d:/aaa/bbb/cc/ddd", 4) -》 "d:/"
|
||||
* getParent("d:/aaa/bbb/cc/ddd", 5) -》 null
|
||||
* </pre>
|
||||
*
|
||||
* @param filePath 目录或文件路径
|
||||
@@ -3378,10 +3380,10 @@ public class FileUtil {
|
||||
* 获取指定层级的父路径
|
||||
*
|
||||
* <pre>
|
||||
* getParent(file("d:/aaa/bbb/cc/ddd", 0)) -> "d:/aaa/bbb/cc/ddd"
|
||||
* getParent(file("d:/aaa/bbb/cc/ddd", 2)) -> "d:/aaa/bbb"
|
||||
* getParent(file("d:/aaa/bbb/cc/ddd", 4)) -> "d:/"
|
||||
* getParent(file("d:/aaa/bbb/cc/ddd", 5)) -> null
|
||||
* getParent(file("d:/aaa/bbb/cc/ddd", 0)) -》 "d:/aaa/bbb/cc/ddd"
|
||||
* getParent(file("d:/aaa/bbb/cc/ddd", 2)) -》 "d:/aaa/bbb"
|
||||
* getParent(file("d:/aaa/bbb/cc/ddd", 4)) -》 "d:/"
|
||||
* getParent(file("d:/aaa/bbb/cc/ddd", 5)) -》 null
|
||||
* </pre>
|
||||
*
|
||||
* @param file 目录或文件
|
||||
|
@@ -139,6 +139,7 @@ public class FileCopier extends SrcToDestCopier<File, FileCopier>{
|
||||
* 设置当拷贝来源是目录时是否只拷贝文件而忽略子目录
|
||||
*
|
||||
* @param isOnlyCopyFile 当拷贝来源是目录时是否只拷贝文件而忽略子目录
|
||||
* @return this
|
||||
* @since 4.1.5
|
||||
*/
|
||||
public FileCopier setOnlyCopyFile(boolean isOnlyCopyFile) {
|
||||
|
@@ -16,7 +16,7 @@ public class MultiFileResource extends MultiResource{
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param files
|
||||
* @param files 文件资源列表
|
||||
*/
|
||||
public MultiFileResource(Collection<File> files) {
|
||||
super();
|
||||
@@ -26,7 +26,7 @@ public class MultiFileResource extends MultiResource{
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param files
|
||||
* @param files 文件资源列表
|
||||
*/
|
||||
public MultiFileResource(File... files) {
|
||||
super();
|
||||
|
@@ -442,7 +442,7 @@ public class WatchMonitor extends Thread implements Closeable, Serializable {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置监听选项,例如监听频率等,可设置项包括:<p>
|
||||
* 设置监听选项,例如监听频率等,可设置项包括:
|
||||
*
|
||||
* <pre>
|
||||
* 1、com.sun.nio.file.StandardWatchEventKinds
|
||||
|
@@ -525,14 +525,14 @@ public class Assert {
|
||||
* 检查下标(数组、集合、字符串)是否符合要求,下标必须满足:
|
||||
*
|
||||
* <pre>
|
||||
* 0 <= index < size
|
||||
* 0 ≤ index < size
|
||||
* </pre>
|
||||
*
|
||||
* @param index 下标
|
||||
* @param size 长度
|
||||
* @return 检查后的下标
|
||||
* @throws IllegalArgumentException 如果size < 0 抛出此异常
|
||||
* @throws IndexOutOfBoundsException 如果index < 0或者 index >= size 抛出此异常
|
||||
* @throws IllegalArgumentException 如果size < 0 抛出此异常
|
||||
* @throws IndexOutOfBoundsException 如果index < 0或者 index ≥ size 抛出此异常
|
||||
* @since 4.1.9
|
||||
*/
|
||||
public static int checkIndex(int index, int size) throws IllegalArgumentException, IndexOutOfBoundsException {
|
||||
@@ -543,7 +543,7 @@ public class Assert {
|
||||
* 检查下标(数组、集合、字符串)是否符合要求,下标必须满足:
|
||||
*
|
||||
* <pre>
|
||||
* 0 <= index < size
|
||||
* 0 ≤ index < size
|
||||
* </pre>
|
||||
*
|
||||
* @param index 下标
|
||||
@@ -551,8 +551,8 @@ public class Assert {
|
||||
* @param errorMsgTemplate 异常时的消息模板
|
||||
* @param params 参数列表
|
||||
* @return 检查后的下标
|
||||
* @throws IllegalArgumentException 如果size < 0 抛出此异常
|
||||
* @throws IndexOutOfBoundsException 如果index < 0或者 index >= size 抛出此异常
|
||||
* @throws IllegalArgumentException 如果size < 0 抛出此异常
|
||||
* @throws IndexOutOfBoundsException 如果index < 0或者 index ≥ size 抛出此异常
|
||||
* @since 4.1.9
|
||||
*/
|
||||
public static int checkIndex(int index, int size, String errorMsgTemplate, Object... params) throws IllegalArgumentException, IndexOutOfBoundsException {
|
||||
|
@@ -16,15 +16,14 @@ import cn.hutool.core.util.URLUtil;
|
||||
|
||||
/**
|
||||
* 外部Jar的类加载器
|
||||
*
|
||||
* @author Looly
|
||||
*
|
||||
* @author Looly
|
||||
*/
|
||||
public class JarClassLoader extends URLClassLoader {
|
||||
|
||||
|
||||
/**
|
||||
* 加载Jar到ClassPath
|
||||
*
|
||||
*
|
||||
* @param dir jar文件或所在目录
|
||||
* @return JarClassLoader
|
||||
*/
|
||||
@@ -37,7 +36,7 @@ public class JarClassLoader extends URLClassLoader {
|
||||
|
||||
/**
|
||||
* 加载Jar到ClassPath
|
||||
*
|
||||
*
|
||||
* @param jarFile jar文件或所在目录
|
||||
* @return JarClassLoader
|
||||
*/
|
||||
@@ -49,8 +48,8 @@ public class JarClassLoader extends URLClassLoader {
|
||||
|
||||
/**
|
||||
* 加载Jar文件到指定loader中
|
||||
*
|
||||
* @param loader {@link URLClassLoader}
|
||||
*
|
||||
* @param loader {@link URLClassLoader}
|
||||
* @param jarFile 被加载的jar
|
||||
* @throws UtilException IO异常包装和执行异常
|
||||
*/
|
||||
@@ -61,7 +60,7 @@ public class JarClassLoader extends URLClassLoader {
|
||||
method.setAccessible(true);
|
||||
final List<File> jars = loopJar(jarFile);
|
||||
for (File jar : jars) {
|
||||
ReflectUtil.invoke(loader, method, new Object[] { jar.toURI().toURL() });
|
||||
ReflectUtil.invoke(loader, method, new Object[]{jar.toURI().toURL()});
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
@@ -71,7 +70,7 @@ public class JarClassLoader extends URLClassLoader {
|
||||
|
||||
/**
|
||||
* 加载Jar文件到System ClassLoader中
|
||||
*
|
||||
*
|
||||
* @param jarFile 被加载的jar
|
||||
* @return System ClassLoader
|
||||
*/
|
||||
@@ -82,16 +81,17 @@ public class JarClassLoader extends URLClassLoader {
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------- Constructor start
|
||||
|
||||
/**
|
||||
* 构造
|
||||
*/
|
||||
public JarClassLoader() {
|
||||
this(new URL[] {});
|
||||
this(new URL[]{});
|
||||
}
|
||||
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
*
|
||||
* @param urls 被加载的URL
|
||||
*/
|
||||
public JarClassLoader(URL[] urls) {
|
||||
@@ -101,12 +101,12 @@ public class JarClassLoader extends URLClassLoader {
|
||||
|
||||
/**
|
||||
* 加载Jar文件,或者加载目录
|
||||
*
|
||||
*
|
||||
* @param jarFileOrDir jar文件或者jar文件所在目录
|
||||
* @return this
|
||||
*/
|
||||
public JarClassLoader addJar(File jarFileOrDir) {
|
||||
if(isJarFile(jarFileOrDir)) {
|
||||
if (isJarFile(jarFileOrDir)) {
|
||||
return addURL(jarFileOrDir);
|
||||
}
|
||||
final List<File> jars = loopJar(jarFileOrDir);
|
||||
@@ -124,8 +124,9 @@ public class JarClassLoader extends URLClassLoader {
|
||||
/**
|
||||
* 增加class所在目录或文件<br>
|
||||
* 如果为目录,此目录用于搜索class文件,如果为文件,需为jar文件
|
||||
*
|
||||
*
|
||||
* @param dir 目录
|
||||
* @return this
|
||||
* @since 4.4.2
|
||||
*/
|
||||
public JarClassLoader addURL(File dir) {
|
||||
@@ -134,9 +135,10 @@ public class JarClassLoader extends URLClassLoader {
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------- Private method start
|
||||
|
||||
/**
|
||||
* 递归获得Jar文件
|
||||
*
|
||||
*
|
||||
* @param file jar文件或者包含jar文件的目录
|
||||
* @return jar文件列表
|
||||
*/
|
||||
@@ -151,7 +153,7 @@ public class JarClassLoader extends URLClassLoader {
|
||||
|
||||
/**
|
||||
* 是否为jar文件
|
||||
*
|
||||
*
|
||||
* @param file 文件
|
||||
* @return 是否为jar文件
|
||||
* @since 4.4.2
|
||||
|
@@ -11,22 +11,21 @@ import cn.hutool.core.util.StrUtil;
|
||||
/**
|
||||
* 提供通用唯一识别码(universally unique identifier)(UUID)实现,UUID表示一个128位的值。<br>
|
||||
* 此类拷贝自java.util.UUID,用于生成不带-的UUID字符串
|
||||
*
|
||||
*
|
||||
* <p>
|
||||
* 这些通用标识符具有不同的变体。此类的方法用于操作 Leach-Salz 变体,不过构造方法允许创建任何 UUID 变体(将在下面进行描述)。
|
||||
* <p>
|
||||
*
|
||||
* 变体 2 (Leach-Salz) UUID 的布局如下: long 型数据的最高有效位由以下无符号字段组成:
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* 0xFFFFFFFF00000000 time_low
|
||||
* 0x00000000FFFF0000 time_mid
|
||||
* 0x000000000000F000 version
|
||||
* 0x0000000000000FFF time_hi
|
||||
* </pre>
|
||||
*
|
||||
* <p>
|
||||
* long 型数据的最低有效位由以下无符号字段组成:
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* 0xC000000000000000 variant
|
||||
* 0x3FFF000000000000 clock_seq
|
||||
@@ -46,23 +45,26 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
|
||||
/**
|
||||
* {@link SecureRandom} 的单例
|
||||
*
|
||||
* @author looly
|
||||
*
|
||||
* @author looly
|
||||
*/
|
||||
private static class Holder {
|
||||
static final SecureRandom numberGenerator = RandomUtil.getSecureRandom();
|
||||
}
|
||||
|
||||
/** 此UUID的最高64有效位 */
|
||||
/**
|
||||
* 此UUID的最高64有效位
|
||||
*/
|
||||
private final long mostSigBits;
|
||||
|
||||
/** 此UUID的最低64有效位 */
|
||||
/**
|
||||
* 此UUID的最低64有效位
|
||||
*/
|
||||
private final long leastSigBits;
|
||||
|
||||
/**
|
||||
* 私有构造
|
||||
*
|
||||
*
|
||||
* @param data 数据
|
||||
*/
|
||||
private UUID(byte[] data) {
|
||||
@@ -82,26 +84,26 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
/**
|
||||
* 使用指定的数据构造新的 UUID。
|
||||
*
|
||||
* @param mostSigBits 用于 {@code UUID} 的最高有效 64 位
|
||||
* @param mostSigBits 用于 {@code UUID} 的最高有效 64 位
|
||||
* @param leastSigBits 用于 {@code UUID} 的最低有效 64 位
|
||||
*/
|
||||
public UUID(long mostSigBits, long leastSigBits) {
|
||||
this.mostSigBits = mostSigBits;
|
||||
this.leastSigBits = leastSigBits;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的本地线程伪随机数生成器生成该 UUID。
|
||||
*
|
||||
*
|
||||
* @return 随机生成的 {@code UUID}
|
||||
*/
|
||||
public static UUID fastUUID() {
|
||||
return randomUUID(false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。
|
||||
*
|
||||
*
|
||||
* @return 随机生成的 {@code UUID}
|
||||
*/
|
||||
public static UUID randomUUID() {
|
||||
@@ -110,7 +112,7 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
|
||||
/**
|
||||
* 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。
|
||||
*
|
||||
*
|
||||
* @param isSecure 是否使用{@link SecureRandom}如果是可以获得更安全的随机码,否则可以得到更好的性能
|
||||
* @return 随机生成的 {@code UUID}
|
||||
*/
|
||||
@@ -130,7 +132,6 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* 根据指定的字节数组获取类型 3(基于名称的)UUID 的静态工厂。
|
||||
*
|
||||
* @param name 用于构造 UUID 的字节数组。
|
||||
*
|
||||
* @return 根据指定数组生成的 {@code UUID}
|
||||
*/
|
||||
public static UUID nameUUIDFromBytes(byte[] name) {
|
||||
@@ -154,7 +155,6 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* @param name 指定 {@code UUID} 字符串
|
||||
* @return 具有指定值的 {@code UUID}
|
||||
* @throws IllegalArgumentException 如果 name 与 {@link #toString} 中描述的字符串表示形式不符抛出此异常
|
||||
*
|
||||
*/
|
||||
public static UUID fromString(String name) {
|
||||
String[] components = name.split("-");
|
||||
@@ -247,6 +247,7 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* 时间戳值仅在在基于时间的 UUID(其 version 类型为 1)中才有意义。<br>
|
||||
* 如果此 {@code UUID} 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。
|
||||
*
|
||||
* @return 时间戳值
|
||||
* @throws UnsupportedOperationException 如果此 {@code UUID} 不是 version 为 1 的 UUID。
|
||||
*/
|
||||
public long timestamp() throws UnsupportedOperationException {
|
||||
@@ -265,7 +266,6 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* {@code clockSequence} 值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。
|
||||
*
|
||||
* @return 此 {@code UUID} 的时钟序列
|
||||
*
|
||||
* @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1
|
||||
*/
|
||||
public int clockSequence() throws UnsupportedOperationException {
|
||||
@@ -283,7 +283,6 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。
|
||||
*
|
||||
* @return 此 {@code UUID} 的节点值
|
||||
*
|
||||
* @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1
|
||||
*/
|
||||
public long node() throws UnsupportedOperationException {
|
||||
@@ -298,7 +297,7 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
*
|
||||
* <p>
|
||||
* UUID 的字符串表示形式由此 BNF 描述:
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* {@code
|
||||
* UUID = <time_low>-<time_mid>-<time_high_and_version>-<variant_and_sequence>-<node>
|
||||
@@ -311,8 +310,6 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* hexDigit = [0-9a-fA-F]
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* </blockquote>
|
||||
*
|
||||
* @return 此{@code UUID} 的字符串表现形式
|
||||
* @see #toString(boolean)
|
||||
@@ -327,7 +324,7 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
*
|
||||
* <p>
|
||||
* UUID 的字符串表示形式由此 BNF 描述:
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* {@code
|
||||
* UUID = <time_low>-<time_mid>-<time_high_and_version>-<variant_and_sequence>-<node>
|
||||
@@ -340,8 +337,6 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* hexDigit = [0-9a-fA-F]
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* </blockquote>
|
||||
*
|
||||
* @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串
|
||||
* @return 此{@code UUID} 的字符串表现形式
|
||||
@@ -390,7 +385,6 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* 当且仅当参数不为 {@code null}、而是一个 UUID 对象、具有与此 UUID 相同的 varriant、包含相同的值(每一位均相同)时,结果才为 {@code true}。
|
||||
*
|
||||
* @param obj 要与之比较的对象
|
||||
*
|
||||
* @return 如果对象相同,则返回 {@code true};否则返回 {@code false}
|
||||
*/
|
||||
public boolean equals(Object obj) {
|
||||
@@ -410,9 +404,7 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* 如果两个 UUID 不同,且第一个 UUID 的最高有效字段大于第二个 UUID 的对应字段,则第一个 UUID 大于第二个 UUID。
|
||||
*
|
||||
* @param val 与此 UUID 比较的 UUID
|
||||
*
|
||||
* @return 在此 UUID 小于、等于或大于 val 时,分别返回 -1、0 或 1。
|
||||
*
|
||||
*/
|
||||
public int compareTo(UUID val) {
|
||||
// The ordering is intentionally set up so that the UUIDs
|
||||
@@ -425,10 +417,11 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------------------------- Private method start
|
||||
|
||||
/**
|
||||
* 返回指定数字对应的hex值
|
||||
*
|
||||
* @param val 值
|
||||
*
|
||||
* @param val 值
|
||||
* @param digits 位
|
||||
* @return 值
|
||||
*/
|
||||
|
@@ -13,53 +13,86 @@ import cn.hutool.core.util.StrUtil;
|
||||
|
||||
/**
|
||||
* 字段验证器
|
||||
*
|
||||
* @author Looly
|
||||
*
|
||||
* @author Looly
|
||||
*/
|
||||
public class Validator {
|
||||
|
||||
private Validator() {
|
||||
}
|
||||
|
||||
/** 英文字母 、数字和下划线 */
|
||||
/**
|
||||
* 英文字母 、数字和下划线
|
||||
*/
|
||||
public final static Pattern GENERAL = PatternPool.GENERAL;
|
||||
/** 数字 */
|
||||
/**
|
||||
* 数字
|
||||
*/
|
||||
public final static Pattern NUMBERS = PatternPool.NUMBERS;
|
||||
/** 分组 */
|
||||
/**
|
||||
* 分组
|
||||
*/
|
||||
public final static Pattern GROUP_VAR = PatternPool.GROUP_VAR;
|
||||
/** IP v4 */
|
||||
/**
|
||||
* IP v4
|
||||
*/
|
||||
public final static Pattern IPV4 = PatternPool.IPV4;
|
||||
/** IP v6 */
|
||||
/**
|
||||
* IP v6
|
||||
*/
|
||||
public final static Pattern IPV6 = PatternPool.IPV6;
|
||||
/** 货币 */
|
||||
/**
|
||||
* 货币
|
||||
*/
|
||||
public final static Pattern MONEY = PatternPool.MONEY;
|
||||
/** 邮件 */
|
||||
/**
|
||||
* 邮件
|
||||
*/
|
||||
public final static Pattern EMAIL = PatternPool.EMAIL;
|
||||
/** 移动电话 */
|
||||
/**
|
||||
* 移动电话
|
||||
*/
|
||||
public final static Pattern MOBILE = PatternPool.MOBILE;
|
||||
/** 身份证号码 */
|
||||
/**
|
||||
* 身份证号码
|
||||
*/
|
||||
public final static Pattern CITIZEN_ID = PatternPool.CITIZEN_ID;
|
||||
/** 邮编 */
|
||||
/**
|
||||
* 邮编
|
||||
*/
|
||||
public final static Pattern ZIP_CODE = PatternPool.ZIP_CODE;
|
||||
/** 生日 */
|
||||
/**
|
||||
* 生日
|
||||
*/
|
||||
public final static Pattern BIRTHDAY = PatternPool.BIRTHDAY;
|
||||
/** URL */
|
||||
/**
|
||||
* URL
|
||||
*/
|
||||
public final static Pattern URL = PatternPool.URL;
|
||||
/** Http URL */
|
||||
/**
|
||||
* Http URL
|
||||
*/
|
||||
public final static Pattern URL_HTTP = PatternPool.URL_HTTP;
|
||||
/** 中文字、英文字母、数字和下划线 */
|
||||
/**
|
||||
* 中文字、英文字母、数字和下划线
|
||||
*/
|
||||
public final static Pattern GENERAL_WITH_CHINESE = PatternPool.GENERAL_WITH_CHINESE;
|
||||
/** UUID */
|
||||
/**
|
||||
* UUID
|
||||
*/
|
||||
public final static Pattern UUID = PatternPool.UUID;
|
||||
/** 不带横线的UUID */
|
||||
/**
|
||||
* 不带横线的UUID
|
||||
*/
|
||||
public final static Pattern UUID_SIMPLE = PatternPool.UUID_SIMPLE;
|
||||
/** 中国车牌号码 */
|
||||
/**
|
||||
* 中国车牌号码
|
||||
*/
|
||||
public final static Pattern PLATE_NUMBER = PatternPool.PLATE_NUMBER;
|
||||
|
||||
/**
|
||||
* 给定值是否为<code>true</code>
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为<code>true</code>
|
||||
* @since 4.4.5
|
||||
@@ -70,7 +103,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 给定值是否不为<code>false</code>
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否不为<code>false</code>
|
||||
* @since 4.4.5
|
||||
@@ -81,10 +114,10 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 检查指定值是否为<code>true</code>
|
||||
*
|
||||
* @param value 值
|
||||
*
|
||||
* @param value 值
|
||||
* @param errorMsgTemplate 错误消息内容模板(变量使用{}表示)
|
||||
* @param params 模板中变量替换后的值
|
||||
* @param params 模板中变量替换后的值
|
||||
* @return 检查过后的值
|
||||
* @throws ValidateException 检查不满足条件抛出的异常
|
||||
* @since 4.4.5
|
||||
@@ -98,10 +131,10 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 检查指定值是否为<code>false</code>
|
||||
*
|
||||
* @param value 值
|
||||
*
|
||||
* @param value 值
|
||||
* @param errorMsgTemplate 错误消息内容模板(变量使用{}表示)
|
||||
* @param params 模板中变量替换后的值
|
||||
* @param params 模板中变量替换后的值
|
||||
* @return 检查过后的值
|
||||
* @throws ValidateException 检查不满足条件抛出的异常
|
||||
* @since 4.4.5
|
||||
@@ -115,7 +148,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 给定值是否为<code>null</code>
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为<code>null</code>
|
||||
*/
|
||||
@@ -125,7 +158,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 给定值是否不为<code>null</code>
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否不为<code>null</code>
|
||||
*/
|
||||
@@ -135,11 +168,11 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 检查指定值是否为<code>null</code>
|
||||
*
|
||||
* @param <T> 被检查的对象类型
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 被检查的对象类型
|
||||
* @param value 值
|
||||
* @param errorMsgTemplate 错误消息内容模板(变量使用{}表示)
|
||||
* @param params 模板中变量替换后的值
|
||||
* @param params 模板中变量替换后的值
|
||||
* @return 检查过后的值
|
||||
* @throws ValidateException 检查不满足条件抛出的异常
|
||||
* @since 4.4.5
|
||||
@@ -153,11 +186,11 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 检查指定值是否非<code>null</code>
|
||||
*
|
||||
* @param <T> 被检查的对象类型
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 被检查的对象类型
|
||||
* @param value 值
|
||||
* @param errorMsgTemplate 错误消息内容模板(变量使用{}表示)
|
||||
* @param params 模板中变量替换后的值
|
||||
* @param params 模板中变量替换后的值
|
||||
* @return 检查过后的值
|
||||
* @throws ValidateException 检查不满足条件抛出的异常
|
||||
*/
|
||||
@@ -171,7 +204,7 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为空<br>
|
||||
* 对于String类型判定是否为empty(null 或 "")<br>
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为空
|
||||
*/
|
||||
@@ -182,7 +215,7 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为非空<br>
|
||||
* 对于String类型判定是否为empty(null 或 "")<br>
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为空
|
||||
*/
|
||||
@@ -193,8 +226,9 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为空,非空时抛出异常<br>
|
||||
* 对于String类型判定是否为empty(null 或 "")<br>
|
||||
*
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 值类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值,验证通过返回此值,空值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -209,8 +243,9 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为非空,为空时抛出异常<br>
|
||||
* 对于String类型判定是否为empty(null 或 "")<br>
|
||||
*
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 值类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值,验证通过返回此值,非空值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -225,7 +260,7 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否相等<br>
|
||||
* 当两值都为null返回true
|
||||
*
|
||||
*
|
||||
* @param t1 对象1
|
||||
* @param t2 对象2
|
||||
* @return 当两值都为null或相等返回true
|
||||
@@ -236,9 +271,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否相等,不相等抛出异常<br>
|
||||
*
|
||||
* @param t1 对象1
|
||||
* @param t2 对象2
|
||||
*
|
||||
* @param t1 对象1
|
||||
* @param t2 对象2
|
||||
* @param errorMsg 错误信息
|
||||
* @return 相同值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -252,9 +287,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否不等,相等抛出异常<br>
|
||||
*
|
||||
* @param t1 对象1
|
||||
* @param t2 对象2
|
||||
*
|
||||
* @param t1 对象1
|
||||
* @param t2 对象2
|
||||
* @param errorMsg 错误信息
|
||||
* @throws ValidateException 验证异常
|
||||
*/
|
||||
@@ -268,9 +303,9 @@ public class Validator {
|
||||
* 验证是否非空且与指定值相等<br>
|
||||
* 当数据为空时抛出验证异常<br>
|
||||
* 当两值不等时抛出异常
|
||||
*
|
||||
* @param t1 对象1
|
||||
* @param t2 对象2
|
||||
*
|
||||
* @param t1 对象1
|
||||
* @param t2 对象2
|
||||
* @param errorMsg 错误信息
|
||||
* @throws ValidateException 验证异常
|
||||
*/
|
||||
@@ -283,9 +318,9 @@ public class Validator {
|
||||
* 验证是否非空且与指定值相等<br>
|
||||
* 当数据为空时抛出验证异常<br>
|
||||
* 当两值相等时抛出异常
|
||||
*
|
||||
* @param t1 对象1
|
||||
* @param t2 对象2
|
||||
*
|
||||
* @param t1 对象1
|
||||
* @param t2 对象2
|
||||
* @param errorMsg 错误信息
|
||||
* @throws ValidateException 验证异常
|
||||
*/
|
||||
@@ -296,7 +331,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 通过正则表达式验证
|
||||
*
|
||||
*
|
||||
* @param regex 正则
|
||||
* @param value 值
|
||||
* @return 是否匹配正则
|
||||
@@ -308,10 +343,10 @@ public class Validator {
|
||||
/**
|
||||
* 通过正则表达式验证<br>
|
||||
* 不符合正则抛出{@link ValidateException} 异常
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param regex 正则
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param regex 正则
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -325,9 +360,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 通过正则表达式验证
|
||||
*
|
||||
*
|
||||
* @param pattern 正则模式
|
||||
* @param value 值
|
||||
* @param value 值
|
||||
* @return 是否匹配正则
|
||||
*/
|
||||
public static boolean isMactchRegex(Pattern pattern, CharSequence value) {
|
||||
@@ -336,7 +371,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为英文字母 、数字和下划线
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为英文字母 、数字和下划线
|
||||
*/
|
||||
@@ -346,9 +381,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为英文字母 、数字和下划线
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -362,10 +397,10 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为给定长度范围的英文字母 、数字和下划线
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @param min 最小长度,负数自动识别为0
|
||||
* @param max 最大长度,0或负数表示不限制最大长度
|
||||
* @param min 最小长度,负数自动识别为0
|
||||
* @param max 最大长度,0或负数表示不限制最大长度
|
||||
* @return 是否为给定长度范围的英文字母 、数字和下划线
|
||||
*/
|
||||
public static boolean isGeneral(CharSequence value, int min, int max) {
|
||||
@@ -381,11 +416,11 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为给定长度范围的英文字母 、数字和下划线
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param min 最小长度,负数自动识别为0
|
||||
* @param max 最大长度,0或负数表示不限制最大长度
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param min 最小长度,负数自动识别为0
|
||||
* @param max 最大长度,0或负数表示不限制最大长度
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -399,9 +434,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为给定最小长度的英文字母 、数字和下划线
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @param min 最小长度,负数自动识别为0
|
||||
* @param min 最小长度,负数自动识别为0
|
||||
* @return 是否为给定最小长度的英文字母 、数字和下划线
|
||||
*/
|
||||
public static boolean isGeneral(CharSequence value, int min) {
|
||||
@@ -410,10 +445,10 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为给定最小长度的英文字母 、数字和下划线
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param min 最小长度,负数自动识别为0
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param min 最小长度,负数自动识别为0
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -424,7 +459,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 判断字符串是否全部为字母组成,包括大写和小写字母和汉字
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否全部为字母组成,包括大写和小写字母和汉字
|
||||
* @since 3.3.0
|
||||
@@ -440,9 +475,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否全部为字母组成,包括大写和小写字母和汉字
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -457,7 +492,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 判断字符串是否全部为大写字母
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否全部为大写字母
|
||||
* @since 3.3.0
|
||||
@@ -473,9 +508,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证字符串是否全部为大写字母
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -490,7 +525,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 判断字符串是否全部为小写字母
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否全部为小写字母
|
||||
* @since 3.3.0
|
||||
@@ -506,9 +541,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证字符串是否全部为小写字母
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -523,7 +558,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证该字符串是否是数字
|
||||
*
|
||||
*
|
||||
* @param value 字符串内容
|
||||
* @return 是否是数字
|
||||
*/
|
||||
@@ -533,8 +568,8 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为数字
|
||||
*
|
||||
* @param value 表单值
|
||||
*
|
||||
* @param value 表单值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -548,7 +583,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证该字符串是否是字母(包括大写和小写字母)
|
||||
*
|
||||
*
|
||||
* @param value 字符串内容
|
||||
* @return 是否是字母(包括大写和小写字母)
|
||||
* @since 4.1.8
|
||||
@@ -559,9 +594,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为字母(包括大写和小写字母)
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -576,7 +611,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为货币
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为货币
|
||||
*/
|
||||
@@ -586,9 +621,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为货币
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -603,7 +638,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为邮政编码(中国)
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为邮政编码(中国)
|
||||
*/
|
||||
@@ -613,9 +648,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为邮政编码(中国)
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -629,7 +664,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为可用邮箱地址
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 否为可用邮箱地址
|
||||
*/
|
||||
@@ -639,9 +674,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为可用邮箱地址
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -655,7 +690,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为手机号码(中国)
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为手机号码(中国)
|
||||
*/
|
||||
@@ -665,9 +700,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为手机号码(中国)
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -682,7 +717,7 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为身份证号码(18位中国)<br>
|
||||
* 出生日期只支持到到2999年
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为身份证号码(18位中国)
|
||||
*/
|
||||
@@ -693,9 +728,9 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为身份证号码(18位中国)<br>
|
||||
* 出生日期只支持到到2999年
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -709,10 +744,10 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为生日
|
||||
*
|
||||
* @param year 年,从1900年开始计算
|
||||
*
|
||||
* @param year 年,从1900年开始计算
|
||||
* @param month 月,从1开始计数
|
||||
* @param day 日,从1开始计数
|
||||
* @param day 日,从1开始计数
|
||||
* @return 是否为生日
|
||||
*/
|
||||
public static boolean isBirthday(int year, int month, int day) {
|
||||
@@ -752,7 +787,7 @@ public class Validator {
|
||||
* <li>yyyy.MM.dd</li>
|
||||
* <li>yyyy年MM月dd日</li>
|
||||
* </ul>
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为生日
|
||||
*/
|
||||
@@ -771,9 +806,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证验证是否为生日
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -787,7 +822,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为IPV4地址
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为IPV4地址
|
||||
*/
|
||||
@@ -797,9 +832,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为IPV4地址
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -810,22 +845,22 @@ public class Validator {
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 验证是否为IPV6地址
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为IPV6地址
|
||||
*/
|
||||
public static boolean isIpv6(CharSequence value) {
|
||||
return isMactchRegex(IPV6, value);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 验证是否为IPV6地址
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -839,7 +874,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为MAC地址
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为MAC地址
|
||||
* @since 4.1.3
|
||||
@@ -850,9 +885,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为MAC地址
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -867,7 +902,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为中国车牌号
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为中国车牌号
|
||||
* @since 3.0.6
|
||||
@@ -878,9 +913,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为中国车牌号
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -895,7 +930,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为URL
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为URL
|
||||
*/
|
||||
@@ -910,9 +945,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为URL
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -926,7 +961,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为汉字
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为汉字
|
||||
*/
|
||||
@@ -936,9 +971,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为汉字
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -952,7 +987,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为中文字、英文字母、数字和下划线
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为中文字、英文字母、数字和下划线
|
||||
*/
|
||||
@@ -962,9 +997,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为中文字、英文字母、数字和下划线
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -979,7 +1014,7 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为UUID<br>
|
||||
* 包括带横线标准格式和不带横线的简单模式
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为UUID
|
||||
*/
|
||||
@@ -990,9 +1025,9 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为UUID<br>
|
||||
* 包括带横线标准格式和不带横线的简单模式
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -1006,7 +1041,7 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为Hex(16进制)字符串
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @return 是否为Hex(16进制)字符串
|
||||
* @since 4.3.3
|
||||
@@ -1017,9 +1052,9 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 验证是否为Hex(16进制)字符串
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -1034,10 +1069,10 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 检查给定的数字是否在指定范围内
|
||||
*
|
||||
*
|
||||
* @param value 值
|
||||
* @param min 最小值(包含)
|
||||
* @param max 最大值(包含)
|
||||
* @param min 最小值(包含)
|
||||
* @param max 最大值(包含)
|
||||
* @return 是否满足
|
||||
* @since 4.1.10
|
||||
*/
|
||||
@@ -1051,10 +1086,10 @@ public class Validator {
|
||||
|
||||
/**
|
||||
* 检查给定的数字是否在指定范围内
|
||||
*
|
||||
* @param value 值
|
||||
* @param min 最小值(包含)
|
||||
* @param max 最大值(包含)
|
||||
*
|
||||
* @param value 值
|
||||
* @param min 最小值(包含)
|
||||
* @param max 最大值(包含)
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @throws ValidateException 验证异常
|
||||
* @since 4.1.10
|
||||
|
@@ -36,7 +36,8 @@ public class WeightRandom<T> implements Serializable {
|
||||
|
||||
/**
|
||||
* 创建权重随机获取器
|
||||
*
|
||||
*
|
||||
* @param <T> 权重随机获取的对象类型
|
||||
* @return {@link WeightRandom}
|
||||
*/
|
||||
public static <T> WeightRandom<T> create() {
|
||||
@@ -99,7 +100,7 @@ public class WeightRandom<T> implements Serializable {
|
||||
* @return this
|
||||
*/
|
||||
public WeightRandom<T> add(T obj, double weight) {
|
||||
return add(new WeightObj<T>(obj, weight));
|
||||
return add(new WeightObj<>(obj, weight));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -226,10 +227,7 @@ public class WeightRandom<T> implements Serializable {
|
||||
} else if (!this.obj.equals(other.obj)) {
|
||||
return false;
|
||||
}
|
||||
if (Double.doubleToLongBits(weight) != Double.doubleToLongBits(other.weight)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
return Double.doubleToLongBits(weight) == Double.doubleToLongBits(other.weight);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -119,7 +119,7 @@ public class MapProxy extends OptNullBasicTypeFromObjectGetter<Object> implement
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
||||
public Object invoke(Object proxy, Method method, Object[] args) {
|
||||
final Class<?>[] parameterTypes = method.getParameterTypes();
|
||||
if (ArrayUtil.isEmpty(parameterTypes)) {
|
||||
final Class<?> returnType = method.getReturnType();
|
||||
@@ -166,7 +166,8 @@ public class MapProxy extends OptNullBasicTypeFromObjectGetter<Object> implement
|
||||
|
||||
/**
|
||||
* 将Map代理为指定接口的动态代理对象
|
||||
*
|
||||
*
|
||||
* @param <T> 代理的Bean类型
|
||||
* @param interfaceClass 接口
|
||||
* @return 代理对象
|
||||
* @since 4.5.2
|
||||
|
@@ -16,20 +16,24 @@ import cn.hutool.core.util.StrUtil;
|
||||
|
||||
/**
|
||||
* Map相关工具类
|
||||
*
|
||||
*
|
||||
* @author Looly
|
||||
* @since 3.1.1
|
||||
*/
|
||||
public class MapUtil {
|
||||
|
||||
/** 默认初始大小 */
|
||||
/**
|
||||
* 默认初始大小
|
||||
*/
|
||||
public static final int DEFAULT_INITIAL_CAPACITY = 16;
|
||||
/** 默认增长因子,当Map的size达到 容量*增长因子时,开始扩充Map */
|
||||
/**
|
||||
* 默认增长因子,当Map的size达到 容量*增长因子时,开始扩充Map
|
||||
*/
|
||||
public static final float DEFAULT_LOAD_FACTOR = 0.75f;
|
||||
|
||||
/**
|
||||
* Map是否为空
|
||||
*
|
||||
*
|
||||
* @param map 集合
|
||||
* @return 是否为空
|
||||
*/
|
||||
@@ -39,7 +43,7 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* Map是否为非空
|
||||
*
|
||||
*
|
||||
* @param map 集合
|
||||
* @return 是否为非空
|
||||
*/
|
||||
@@ -58,28 +62,29 @@ public class MapUtil {
|
||||
* @since 4.6.3
|
||||
*/
|
||||
public static <K, V> Map<K, V> emptyIfNull(Map<K, V> set) {
|
||||
return (null == set) ? Collections.<K, V>emptyMap() : set;
|
||||
return (null == set) ? Collections.emptyMap() : set;
|
||||
}
|
||||
|
||||
/**
|
||||
* 如果给定Map为空,返回默认Map
|
||||
*
|
||||
* @param <T> 集合类型
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param map Map
|
||||
* @param <T> 集合类型
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param map Map
|
||||
* @param defaultMap 默认Map
|
||||
* @return 非空(empty)的原Map或默认Map
|
||||
* @since 4.6.9
|
||||
*/
|
||||
public static <T extends Map<K, V>, K, V> T defaultIfEmpty(T map, T defaultMap){
|
||||
public static <T extends Map<K, V>, K, V> T defaultIfEmpty(T map, T defaultMap) {
|
||||
return isEmpty(map) ? defaultMap : map;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------------- new HashMap
|
||||
|
||||
/**
|
||||
* 新建一个HashMap
|
||||
*
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @return HashMap对象
|
||||
@@ -90,24 +95,24 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 新建一个HashMap
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param size 初始大小,由于默认负载因子0.75,传入的size会实际初始大小为size / 0.75 + 1
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param size 初始大小,由于默认负载因子0.75,传入的size会实际初始大小为size / 0.75 + 1
|
||||
* @param isOrder Map的Key是否有序,有序返回 {@link LinkedHashMap},否则返回 {@link HashMap}
|
||||
* @return HashMap对象
|
||||
* @since 3.0.4
|
||||
*/
|
||||
public static <K, V> HashMap<K, V> newHashMap(int size, boolean isOrder) {
|
||||
int initialCapacity = (int) (size / DEFAULT_LOAD_FACTOR) + 1;
|
||||
return isOrder ? new LinkedHashMap<K, V>(initialCapacity) : new HashMap<K, V>(initialCapacity);
|
||||
return isOrder ? new LinkedHashMap<>(initialCapacity) : new HashMap<>(initialCapacity);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新建一个HashMap
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param size 初始大小,由于默认负载因子0.75,传入的size会实际初始大小为size / 0.75 + 1
|
||||
* @return HashMap对象
|
||||
*/
|
||||
@@ -117,9 +122,9 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 新建一个HashMap
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param isOrder Map的Key是否有序,有序返回 {@link LinkedHashMap},否则返回 {@link HashMap}
|
||||
* @return HashMap对象
|
||||
*/
|
||||
@@ -129,7 +134,9 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 新建TreeMap,Key有序的Map
|
||||
*
|
||||
*
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param comparator Key比较器
|
||||
* @return TreeMap
|
||||
* @since 3.2.3
|
||||
@@ -140,8 +147,10 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 新建TreeMap,Key有序的Map
|
||||
*
|
||||
* @param map Map
|
||||
*
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param map Map
|
||||
* @param comparator Key比较器
|
||||
* @return TreeMap
|
||||
* @since 3.2.3
|
||||
@@ -156,14 +165,17 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 创建键不重复Map
|
||||
*
|
||||
*
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param size 初始容量
|
||||
* @return {@link IdentityHashMap}
|
||||
* @since 4.5.7
|
||||
*/
|
||||
public static <K, V> Map<K, V> newIdentityMap(int size) {
|
||||
return new IdentityHashMap<>(size);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 新建一个初始容量为{@link MapUtil#DEFAULT_INITIAL_CAPACITY} 的ConcurrentHashMap
|
||||
*
|
||||
@@ -179,8 +191,8 @@ public class MapUtil {
|
||||
* 新建一个ConcurrentHashMap
|
||||
*
|
||||
* @param size 初始容量,当传入的容量小于等于0时,容量为{@link MapUtil#DEFAULT_INITIAL_CAPACITY}
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @return ConcurrentHashMap
|
||||
*/
|
||||
public static <K, V> ConcurrentHashMap<K, V> newConcurrentHashMap(int size) {
|
||||
@@ -189,7 +201,7 @@ public class MapUtil {
|
||||
}
|
||||
|
||||
/**
|
||||
* 传入一个Map将其转化为ConcurrentHashMap类型
|
||||
* 传入一个Map将其转化为ConcurrentHashMap类型
|
||||
*
|
||||
* @param map map
|
||||
* @param <K> key的类型
|
||||
@@ -197,7 +209,7 @@ public class MapUtil {
|
||||
* @return ConcurrentHashMap
|
||||
*/
|
||||
public static <K, V> ConcurrentHashMap<K, V> newConcurrentHashMap(Map<K, V> map) {
|
||||
if(isEmpty(map)) {
|
||||
if (isEmpty(map)) {
|
||||
return new ConcurrentHashMap<>(DEFAULT_INITIAL_CAPACITY);
|
||||
}
|
||||
return new ConcurrentHashMap<>(map);
|
||||
@@ -206,9 +218,9 @@ public class MapUtil {
|
||||
/**
|
||||
* 创建Map<br>
|
||||
* 传入抽象Map{@link AbstractMap}和{@link Map}类将默认创建{@link HashMap}
|
||||
*
|
||||
* @param <K> map键类型
|
||||
* @param <V> map值类型
|
||||
*
|
||||
* @param <K> map键类型
|
||||
* @param <V> map值类型
|
||||
* @param mapType map类型
|
||||
* @return {@link Map}实例
|
||||
*/
|
||||
@@ -222,12 +234,13 @@ public class MapUtil {
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------------- value of
|
||||
|
||||
/**
|
||||
* 将单一键值对转换为Map
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param key 键
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param key 键
|
||||
* @param value 值
|
||||
* @return {@link HashMap}
|
||||
*/
|
||||
@@ -237,11 +250,11 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 将单一键值对转换为Map
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param key 键
|
||||
* @param value 值
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param key 键
|
||||
* @param value 值
|
||||
* @param isOrder 是否有序
|
||||
* @return {@link HashMap}
|
||||
*/
|
||||
@@ -253,20 +266,20 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 将数组转换为Map(HashMap),支持数组元素类型为:
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* Map.Entry
|
||||
* 长度大于1的数组(取前两个值),如果不满足跳过此元素
|
||||
* Iterable 长度也必须大于1(取前两个值),如果不满足跳过此元素
|
||||
* Iterator 长度也必须大于1(取前两个值),如果不满足跳过此元素
|
||||
* </pre>
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* Map<Object, Object> colorMap = MapUtil.of(new String[][] { { "RED", "#FF0000" }, { "GREEN", "#00FF00" }, { "BLUE", "#0000FF" } });
|
||||
* </pre>
|
||||
*
|
||||
* <p>
|
||||
* 参考:commons-lang
|
||||
*
|
||||
*
|
||||
* @param array 数组。元素类型为Map.Entry、数组、Iterable、Iterator
|
||||
* @return {@link HashMap}
|
||||
* @since 3.0.8
|
||||
@@ -317,7 +330,7 @@ public class MapUtil {
|
||||
* 将Map列表中相同key的值组成列表做为Map的value<br>
|
||||
* 是{@link #toMapList(Map)}的逆方法<br>
|
||||
* 比如传入数据:
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* [
|
||||
* {a: 1, b: 1, c: 1}
|
||||
@@ -326,9 +339,9 @@ public class MapUtil {
|
||||
* {a: 4}
|
||||
* ]
|
||||
* </pre>
|
||||
*
|
||||
* <p>
|
||||
* 结果是:
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* {
|
||||
* a: [1,2,3,4]
|
||||
@@ -336,9 +349,9 @@ public class MapUtil {
|
||||
* c: [1]
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param mapList Map列表
|
||||
* @return Map
|
||||
*/
|
||||
@@ -372,7 +385,7 @@ public class MapUtil {
|
||||
* 列转行。将Map中值列表分别按照其位置与key组成新的map。<br>
|
||||
* 是{@link #toListMap(Iterable)}的逆方法<br>
|
||||
* 比如传入数据:
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* {
|
||||
* a: [1,2,3,4]
|
||||
@@ -380,9 +393,9 @@ public class MapUtil {
|
||||
* c: [1]
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* <p>
|
||||
* 结果是:
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* [
|
||||
* {a: 1, b: 1, c: 1}
|
||||
@@ -391,9 +404,9 @@ public class MapUtil {
|
||||
* {a: 4}
|
||||
* ]
|
||||
* </pre>
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param listMap 列表Map
|
||||
* @return Map列表
|
||||
*/
|
||||
@@ -434,7 +447,9 @@ public class MapUtil {
|
||||
/**
|
||||
* 将已知Map转换为key为驼峰风格的Map<br>
|
||||
* 如果KEY为非String类型,保留原值
|
||||
*
|
||||
*
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param map 原Map
|
||||
* @return 驼峰风格Map
|
||||
* @since 3.3.1
|
||||
@@ -445,8 +460,8 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 将键值对转换为二维数组,第一维是key,第二纬是value
|
||||
*
|
||||
* @param map Map<?, ?> map
|
||||
*
|
||||
* @param map map
|
||||
* @return 数组
|
||||
* @since 4.1.9
|
||||
*/
|
||||
@@ -468,13 +483,14 @@ public class MapUtil {
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------------- join
|
||||
|
||||
/**
|
||||
* 将map转成字符串
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param map Map
|
||||
* @param separator entry之间的连接符
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param map Map
|
||||
* @param separator entry之间的连接符
|
||||
* @param keyValueSeparator kv之间的连接符
|
||||
* @return 连接字符串
|
||||
* @since 3.1.1
|
||||
@@ -485,11 +501,11 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 将map转成字符串,忽略null的键和值
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param map Map
|
||||
* @param separator entry之间的连接符
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param map Map
|
||||
* @param separator entry之间的连接符
|
||||
* @param keyValueSeparator kv之间的连接符
|
||||
* @return 连接后的字符串
|
||||
* @since 3.1.1
|
||||
@@ -500,13 +516,13 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 将map转成字符串
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param map Map
|
||||
* @param separator entry之间的连接符
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param map Map
|
||||
* @param separator entry之间的连接符
|
||||
* @param keyValueSeparator kv之间的连接符
|
||||
* @param isIgnoreNull 是否忽略null的键和值
|
||||
* @param isIgnoreNull 是否忽略null的键和值
|
||||
* @return 连接后的字符串
|
||||
* @since 3.1.1
|
||||
*/
|
||||
@@ -527,18 +543,19 @@ public class MapUtil {
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------------- filter
|
||||
|
||||
/**
|
||||
* 过滤<br>
|
||||
* 过滤过程通过传入的Editor实现来返回需要的元素内容,这个Editor实现可以实现以下功能:
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* 1、过滤出需要的对象,如果返回null表示这个元素对象抛弃
|
||||
* 2、修改元素对象,返回集合中为修改后的对象
|
||||
* </pre>
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param map Map
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param map Map
|
||||
* @param editor 编辑器接口
|
||||
* @return 过滤后的Map
|
||||
*/
|
||||
@@ -566,14 +583,14 @@ public class MapUtil {
|
||||
/**
|
||||
* 过滤<br>
|
||||
* 过滤过程通过传入的Editor实现来返回需要的元素内容,这个Filter实现可以实现以下功能:
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* 1、过滤出需要的对象,如果返回null表示这个元素对象抛弃
|
||||
* </pre>
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param map Map
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param map Map
|
||||
* @param filter 编辑器接口
|
||||
* @return 过滤后的Map
|
||||
* @since 3.1.0
|
||||
@@ -599,10 +616,10 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 过滤Map保留指定键值对,如果键不存在跳过
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param map 原始Map
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param map 原始Map
|
||||
* @param keys 键列表
|
||||
* @return Map 结果,结果的Map类型与原Map保持一致
|
||||
* @since 4.0.10
|
||||
@@ -625,7 +642,7 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* Map的键和值互换
|
||||
*
|
||||
*
|
||||
* @param <T> 键和值类型
|
||||
* @param map Map对象,键值类型必须一致
|
||||
* @return 互换后的Map
|
||||
@@ -658,7 +675,7 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 逆转Map的key和value
|
||||
*
|
||||
*
|
||||
* @param <K> 键类型,目标的值类型
|
||||
* @param <V> 值类型,目标的键类型
|
||||
* @param map 被转换的Map
|
||||
@@ -684,11 +701,13 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 排序已有Map,Key有序的Map,使用默认Key排序方式(字母顺序)
|
||||
*
|
||||
*
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param map Map
|
||||
* @return TreeMap
|
||||
* @since 4.0.1
|
||||
* @see #newTreeMap(Map, Comparator)
|
||||
* @since 4.0.1
|
||||
*/
|
||||
public static <K, V> TreeMap<K, V> sort(Map<K, V> map) {
|
||||
return sort(map, null);
|
||||
@@ -696,12 +715,14 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 排序已有Map,Key有序的Map
|
||||
*
|
||||
* @param map Map
|
||||
*
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param map Map
|
||||
* @param comparator Key比较器
|
||||
* @return TreeMap
|
||||
* @since 4.0.1
|
||||
* @see #newTreeMap(Map, Comparator)
|
||||
* @since 4.0.1
|
||||
*/
|
||||
public static <K, V> TreeMap<K, V> sort(Map<K, V> map, Comparator<? super K> comparator) {
|
||||
TreeMap<K, V> result;
|
||||
@@ -721,7 +742,7 @@ public class MapUtil {
|
||||
/**
|
||||
* 创建代理Map<br>
|
||||
* {@link MapProxy}对Map做一次包装,提供各种getXXX方法
|
||||
*
|
||||
*
|
||||
* @param map 被代理的Map
|
||||
* @return {@link MapProxy}
|
||||
* @since 3.2.0
|
||||
@@ -733,7 +754,9 @@ public class MapUtil {
|
||||
/**
|
||||
* 创建Map包装类MapWrapper<br>
|
||||
* {@link MapWrapper}对Map做一次包装
|
||||
*
|
||||
*
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param map 被代理的Map
|
||||
* @return {@link MapWrapper}
|
||||
* @since 4.5.4
|
||||
@@ -743,20 +766,21 @@ public class MapUtil {
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------------- builder
|
||||
|
||||
/**
|
||||
* 创建链接调用map
|
||||
*
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @return map创建类
|
||||
*/
|
||||
public static <K, V> MapBuilder<K, V> builder() {
|
||||
return builder(new HashMap<K, V>());
|
||||
return builder(new HashMap<>());
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建链接调用map
|
||||
*
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param map 实际使用的map
|
||||
@@ -768,11 +792,11 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 创建链接调用map
|
||||
*
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param k key
|
||||
* @param v value
|
||||
* @param k key
|
||||
* @param v value
|
||||
* @return map创建类
|
||||
*/
|
||||
public static <K, V> MapBuilder<K, V> builder(K k, V v) {
|
||||
@@ -781,10 +805,10 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 获取Map的部分key生成新的Map
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param map Map
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param map Map
|
||||
* @param keys 键列表
|
||||
* @return 新Map,只包含指定的key
|
||||
* @since 4.0.6
|
||||
@@ -802,7 +826,7 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 获取Map指定key的值,并转换为字符串
|
||||
*
|
||||
*
|
||||
* @param map Map
|
||||
* @param key 键
|
||||
* @return 值
|
||||
@@ -814,7 +838,7 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 获取Map指定key的值,并转换为Integer
|
||||
*
|
||||
*
|
||||
* @param map Map
|
||||
* @param key 键
|
||||
* @return 值
|
||||
@@ -826,7 +850,7 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 获取Map指定key的值,并转换为Double
|
||||
*
|
||||
*
|
||||
* @param map Map
|
||||
* @param key 键
|
||||
* @return 值
|
||||
@@ -838,7 +862,7 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 获取Map指定key的值,并转换为Float
|
||||
*
|
||||
*
|
||||
* @param map Map
|
||||
* @param key 键
|
||||
* @return 值
|
||||
@@ -850,7 +874,7 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 获取Map指定key的值,并转换为Short
|
||||
*
|
||||
*
|
||||
* @param map Map
|
||||
* @param key 键
|
||||
* @return 值
|
||||
@@ -862,7 +886,7 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 获取Map指定key的值,并转换为Bool
|
||||
*
|
||||
*
|
||||
* @param map Map
|
||||
* @param key 键
|
||||
* @return 值
|
||||
@@ -874,7 +898,7 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 获取Map指定key的值,并转换为Character
|
||||
*
|
||||
*
|
||||
* @param map Map
|
||||
* @param key 键
|
||||
* @return 值
|
||||
@@ -886,7 +910,7 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 获取Map指定key的值,并转换为Long
|
||||
*
|
||||
*
|
||||
* @param map Map
|
||||
* @param key 键
|
||||
* @return 值
|
||||
@@ -898,7 +922,7 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 获取Map指定key的值,并转换为{@link Date}
|
||||
*
|
||||
*
|
||||
* @param map Map
|
||||
* @param key 键
|
||||
* @return 值
|
||||
@@ -910,10 +934,10 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 获取Map指定key的值,并转换为指定类型
|
||||
*
|
||||
* @param <T> 目标值类型
|
||||
* @param map Map
|
||||
* @param key 键
|
||||
*
|
||||
* @param <T> 目标值类型
|
||||
* @param map Map
|
||||
* @param key 键
|
||||
* @param type 值类型
|
||||
* @return 值
|
||||
* @since 4.0.6
|
||||
@@ -924,10 +948,10 @@ public class MapUtil {
|
||||
|
||||
/**
|
||||
* 获取Map指定key的值,并转换为指定类型
|
||||
*
|
||||
* @param <T> 目标值类型
|
||||
* @param map Map
|
||||
* @param key 键
|
||||
*
|
||||
* @param <T> 目标值类型
|
||||
* @param map Map
|
||||
* @param key 键
|
||||
* @param type 值类型
|
||||
* @return 值
|
||||
* @since 4.5.12
|
||||
@@ -940,8 +964,10 @@ public class MapUtil {
|
||||
* 重命名键<br>
|
||||
* 实现方式为一处然后重新put,当旧的key不存在直接返回<br>
|
||||
* 当新的key存在,抛出{@link IllegalArgumentException} 异常
|
||||
*
|
||||
* @param map Map
|
||||
*
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param map Map
|
||||
* @param oldKey 原键
|
||||
* @param newKey 新键
|
||||
* @return map
|
||||
@@ -957,11 +983,13 @@ public class MapUtil {
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 去除Map中值为{@code null}的键值对<br>
|
||||
* 注意:此方法在传入的Map上直接修改。
|
||||
*
|
||||
*
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param map Map
|
||||
* @return map
|
||||
* @since 4.6.5
|
||||
@@ -970,16 +998,16 @@ public class MapUtil {
|
||||
if (isEmpty(map)) {
|
||||
return map;
|
||||
}
|
||||
|
||||
|
||||
final Iterator<Entry<K, V>> iter = map.entrySet().iterator();
|
||||
Entry<K, V> entry;
|
||||
while(iter.hasNext()) {
|
||||
while (iter.hasNext()) {
|
||||
entry = iter.next();
|
||||
if(null == entry.getValue()) {
|
||||
if (null == entry.getValue()) {
|
||||
iter.remove();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return map;
|
||||
}
|
||||
}
|
||||
|
@@ -21,7 +21,7 @@ public class LocalPortGenerater implements Serializable{
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param beginPort
|
||||
* @param beginPort 起始端口号
|
||||
*/
|
||||
public LocalPortGenerater(int beginPort) {
|
||||
alternativePort = new AtomicInteger(beginPort);
|
||||
|
@@ -174,7 +174,8 @@ public class NetUtil {
|
||||
/**
|
||||
* 获取多个本地可用端口<br>
|
||||
* 来自org.springframework.util.SocketUtils
|
||||
*
|
||||
*
|
||||
* @param numRequested 尝试次数
|
||||
* @param minPort 端口最小值(包含)
|
||||
* @param maxPort 端口最大值(包含)
|
||||
* @return 可用的端口
|
||||
@@ -311,7 +312,7 @@ public class NetUtil {
|
||||
return null;
|
||||
}
|
||||
|
||||
return CollectionUtil.addAll(new ArrayList<NetworkInterface>(), networkInterfaces);
|
||||
return CollectionUtil.addAll(new ArrayList<>(), networkInterfaces);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -17,7 +17,7 @@ import cn.hutool.core.util.HexUtil;
|
||||
* 1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不会被编码;
|
||||
* 2.将空格转换为%20 ;
|
||||
* 3.将非文本内容转换成"%xy"的形式,xy是两位16进制的数值;
|
||||
* 4.在每个 name=value 对之间放置 & 符号。
|
||||
* 4.在每个 name=value 对之间放置 & 符号。
|
||||
* </pre>
|
||||
*
|
||||
* @author looly,
|
||||
@@ -34,7 +34,7 @@ public class URLEncoder implements Serializable{
|
||||
* <pre>
|
||||
* pchar = unreserved(不处理) / pct-encoded / sub-delims(子分隔符) / ":" / "@"
|
||||
* unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
|
||||
* sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
|
||||
* sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
|
||||
* </pre>
|
||||
*/
|
||||
public static final URLEncoder DEFAULT = createDefault();
|
||||
@@ -46,7 +46,7 @@ public class URLEncoder implements Serializable{
|
||||
* <pre>
|
||||
* 0x20 ' ' =》 '+'
|
||||
* 0x2A, 0x2D, 0x2E, 0x30 to 0x39, 0x41 to 0x5A, 0x5F, 0x61 to 0x7A as-is
|
||||
* '*', '-', '.', '0' to '9', 'A' to 'Z', '_', 'a' to 'z' Also '=' and '&' 不编码
|
||||
* '*', '-', '.', '0' to '9', 'A' to 'Z', '_', 'a' to 'z' Also '=' and '&' 不编码
|
||||
* 其它编码为 %nn 形式
|
||||
* </pre>
|
||||
*
|
||||
@@ -61,7 +61,7 @@ public class URLEncoder implements Serializable{
|
||||
* <pre>
|
||||
* pchar = unreserved(不处理) / pct-encoded / sub-delims(子分隔符) / ":" / "@"
|
||||
* unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
|
||||
* sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
|
||||
* sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
|
||||
* </pre>
|
||||
*
|
||||
* @return {@link URLEncoder}
|
||||
@@ -100,7 +100,7 @@ public class URLEncoder implements Serializable{
|
||||
* <pre>
|
||||
* 0x20 ' ' =》 '+'
|
||||
* 0x2A, 0x2D, 0x2E, 0x30 to 0x39, 0x41 to 0x5A, 0x5F, 0x61 to 0x7A as-is
|
||||
* '*', '-', '.', '0' to '9', 'A' to 'Z', '_', 'a' to 'z' Also '=' and '&' 不编码
|
||||
* '*', '-', '.', '0' to '9', 'A' to 'Z', '_', 'a' to 'z' Also '=' and '&' 不编码
|
||||
* 其它编码为 %nn 形式
|
||||
* </pre>
|
||||
*
|
||||
|
@@ -97,7 +97,7 @@ public class ClipboardUtil {
|
||||
/**
|
||||
* 从剪贴板的{@link Transferable}获取文本
|
||||
*
|
||||
* @param content
|
||||
* @param content {@link Transferable}
|
||||
* @return 文本
|
||||
* @since 4.5.6
|
||||
*/
|
||||
@@ -126,7 +126,7 @@ public class ClipboardUtil {
|
||||
/**
|
||||
* 从剪贴板的{@link Transferable}获取图片
|
||||
*
|
||||
* @param content
|
||||
* @param content {@link Transferable}
|
||||
* @return 图片
|
||||
* @since 4.5.6
|
||||
*/
|
||||
|
@@ -57,7 +57,7 @@ public class Simhash {
|
||||
this.hammingThresh = hammingThresh;
|
||||
this.storage = new ArrayList<>(fracCount);
|
||||
for (int i = 0; i < fracCount; i++) {
|
||||
storage.add(new HashMap<String, List<Long>>());
|
||||
storage.add(new HashMap<>());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,7 +126,7 @@ public class Simhash {
|
||||
}
|
||||
|
||||
/**
|
||||
* 按照(frac, <simhash, content>)索引进行存储
|
||||
* 按照(frac, 《simhash, content》)索引进行存储
|
||||
*
|
||||
* @param simhash Simhash值
|
||||
*/
|
||||
@@ -146,7 +146,7 @@ public class Simhash {
|
||||
if (fracMap.containsKey(frac)) {
|
||||
fracMap.get(frac).add(simhash);
|
||||
} else {
|
||||
final List<Long> ls = new ArrayList<Long>();
|
||||
final List<Long> ls = new ArrayList<>();
|
||||
ls.add(simhash);
|
||||
fracMap.put(frac, ls);
|
||||
}
|
||||
@@ -184,7 +184,7 @@ public class Simhash {
|
||||
final int bitNum = this.bitNum;
|
||||
final int fracBitNum = this.fracBitNum;
|
||||
|
||||
final List<String> ls = new ArrayList<String>();
|
||||
final List<String> ls = new ArrayList<>();
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < bitNum; i++) {
|
||||
sb.append(simhash >> i & 1);
|
||||
|
@@ -155,7 +155,8 @@ public class StrBuilder implements CharSequence, Appendable, Serializable {
|
||||
/**
|
||||
* 追加对象,对象会被转换为字符串
|
||||
*
|
||||
* @param obj 对象
|
||||
* @param index 插入位置
|
||||
* @param obj 对象
|
||||
* @return this
|
||||
*/
|
||||
public StrBuilder insert(int index, Object obj) {
|
||||
@@ -392,7 +393,7 @@ public class StrBuilder implements CharSequence, Appendable, Serializable {
|
||||
* @param start 开始位置,负数按照0处理(包括)
|
||||
* @param end 结束位置,超出最大长度按照最大长度处理(不包括)
|
||||
* @return this
|
||||
* @throws StringIndexOutOfBoundsException 当start > end抛出此异常
|
||||
* @throws StringIndexOutOfBoundsException 当start > end抛出此异常
|
||||
*/
|
||||
public StrBuilder del(int start, int end) throws StringIndexOutOfBoundsException {
|
||||
if (start < 0) {
|
||||
|
@@ -6,16 +6,17 @@ import java.nio.charset.Charset;
|
||||
|
||||
/**
|
||||
* CSV工具
|
||||
*
|
||||
*
|
||||
* @author looly
|
||||
* @since 4.0.5
|
||||
*/
|
||||
public class CsvUtil {
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------- Reader
|
||||
|
||||
/**
|
||||
* 获取CSV读取器
|
||||
*
|
||||
*
|
||||
* @param config 配置
|
||||
* @return {@link CsvReader}
|
||||
*/
|
||||
@@ -25,71 +26,77 @@ public class CsvUtil {
|
||||
|
||||
/**
|
||||
* 获取CSV读取器
|
||||
*
|
||||
*
|
||||
* @return {@link CsvReader}
|
||||
*/
|
||||
public static CsvReader getReader() {
|
||||
return new CsvReader();
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------- Writer
|
||||
|
||||
/**
|
||||
* 获取CSV生成器(写出器),使用默认配置,覆盖已有文件(如果存在)
|
||||
*
|
||||
*
|
||||
* @param filePath File CSV文件路径
|
||||
* @param charset 编码
|
||||
* @param charset 编码
|
||||
* @return {@link CsvWriter}
|
||||
*/
|
||||
public static CsvWriter getWriter(String filePath, Charset charset) {
|
||||
return new CsvWriter(filePath, charset);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取CSV生成器(写出器),使用默认配置,覆盖已有文件(如果存在)
|
||||
*
|
||||
* @param file File CSV文件
|
||||
*
|
||||
* @param file File CSV文件
|
||||
* @param charset 编码
|
||||
* @return {@link CsvWriter}
|
||||
*/
|
||||
public static CsvWriter getWriter(File file, Charset charset) {
|
||||
return new CsvWriter(file, charset);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取CSV生成器(写出器),使用默认配置
|
||||
*
|
||||
*
|
||||
* @param filePath File CSV文件路径
|
||||
* @param charset 编码
|
||||
* @param charset 编码
|
||||
* @param isAppend 是否追加
|
||||
* @return {@link CsvWriter}
|
||||
*/
|
||||
public static CsvWriter getWriter(String filePath, Charset charset, boolean isAppend) {
|
||||
return new CsvWriter(filePath, charset, isAppend);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取CSV生成器(写出器),使用默认配置
|
||||
*
|
||||
* @param file File CSV文件
|
||||
* @param charset 编码
|
||||
*
|
||||
* @param file File CSV文件
|
||||
* @param charset 编码
|
||||
* @param isAppend 是否追加
|
||||
* @return {@link CsvWriter}
|
||||
*/
|
||||
public static CsvWriter getWriter(File file, Charset charset, boolean isAppend) {
|
||||
return new CsvWriter(file, charset, isAppend);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取CSV生成器(写出器)
|
||||
*
|
||||
* @param file File CSV文件
|
||||
* @param charset 编码
|
||||
*
|
||||
* @param file File CSV文件
|
||||
* @param charset 编码
|
||||
* @param isAppend 是否追加
|
||||
* @param config 写出配置,null则使用默认配置
|
||||
* @param config 写出配置,null则使用默认配置
|
||||
* @return {@link CsvWriter}
|
||||
*/
|
||||
public static CsvWriter getWriter(File file, Charset charset, boolean isAppend, CsvWriteConfig config) {
|
||||
return new CsvWriter(file, charset, isAppend, config);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取CSV生成器(写出器)
|
||||
*
|
||||
*
|
||||
* @param writer Writer
|
||||
* @return {@link CsvWriter}
|
||||
*/
|
||||
@@ -99,7 +106,7 @@ public class CsvUtil {
|
||||
|
||||
/**
|
||||
* 获取CSV生成器(写出器)
|
||||
*
|
||||
*
|
||||
* @param writer Writer
|
||||
* @param config 写出配置,null则使用默认配置
|
||||
* @return {@link CsvWriter}
|
||||
|
@@ -4,12 +4,12 @@ import cn.hutool.core.date.TimeInterval;
|
||||
|
||||
/**
|
||||
* 高并发测试工具类
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* ps:
|
||||
* //模拟1000个线程并发
|
||||
* ConcurrencyTester ct = new ConcurrencyTester(1000);
|
||||
* ct.test(() -> {
|
||||
* ct.test(() -> {
|
||||
* // 需要并发测试的业务代码
|
||||
* });
|
||||
* </pre>
|
||||
@@ -28,8 +28,9 @@ public class ConcurrencyTester {
|
||||
|
||||
/**
|
||||
* 执行测试
|
||||
*
|
||||
*
|
||||
* @param runnable 要测试的内容
|
||||
* @return this
|
||||
*/
|
||||
public ConcurrencyTester test(Runnable runnable) {
|
||||
timeInterval.start();
|
||||
@@ -44,7 +45,7 @@ public class ConcurrencyTester {
|
||||
|
||||
/**
|
||||
* 获取执行时间
|
||||
*
|
||||
*
|
||||
* @return 执行时间,单位毫秒
|
||||
*/
|
||||
public long getInterval() {
|
||||
|
@@ -16,7 +16,7 @@ import cn.hutool.core.exceptions.UtilException;
|
||||
* ps:
|
||||
* //模拟1000个线程并发
|
||||
* SyncFinisher sf = new SyncFinisher(1000);
|
||||
* concurrencyTestUtil.run(() -> {
|
||||
* concurrencyTestUtil.run(() -> {
|
||||
* // 需要并发测试的业务代码
|
||||
* });
|
||||
* </pre>
|
||||
@@ -46,7 +46,7 @@ public class SyncFinisher {
|
||||
this.beginLatch = new CountDownLatch(1);
|
||||
this.threadSize = threadSize;
|
||||
this.executorService = ThreadUtil.newExecutor(threadSize);
|
||||
this.workers = new LinkedHashSet<Worker>();
|
||||
this.workers = new LinkedHashSet<>();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -14,14 +14,14 @@ import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* 线程池工具
|
||||
*
|
||||
*
|
||||
* @author luxiaolei
|
||||
*/
|
||||
public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 新建一个线程池
|
||||
*
|
||||
*
|
||||
* @param threadSize 同时执行的线程数大小
|
||||
* @return ExecutorService
|
||||
*/
|
||||
@@ -35,7 +35,7 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 获得一个新的线程池
|
||||
*
|
||||
*
|
||||
* @return ExecutorService
|
||||
*/
|
||||
public static ExecutorService newExecutor() {
|
||||
@@ -44,7 +44,7 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 获得一个新的线程池,只有单个线程
|
||||
*
|
||||
*
|
||||
* @return ExecutorService
|
||||
*/
|
||||
public static ExecutorService newSingleExecutor() {
|
||||
@@ -54,8 +54,8 @@ public class ThreadUtil {
|
||||
/**
|
||||
* 获得一个新的线程池<br>
|
||||
* 如果maximumPoolSize =》 corePoolSize,在没有新任务加入的情况下,多出的线程将最多保留60s
|
||||
*
|
||||
* @param corePoolSize 初始线程池大小
|
||||
*
|
||||
* @param corePoolSize 初始线程池大小
|
||||
* @param maximumPoolSize 最大线程池大小
|
||||
* @return {@link ThreadPoolExecutor}
|
||||
*/
|
||||
@@ -68,9 +68,9 @@ public class ThreadUtil {
|
||||
* 传入阻塞系数,线程池的大小计算公式为:CPU可用核心数 / (1 - 阻塞因子)<br>
|
||||
* Blocking Coefficient(阻塞系数) = 阻塞时间/(阻塞时间+使用CPU的时间)<br>
|
||||
* 计算密集型任务的阻塞系数为0,而IO密集型任务的阻塞系数则接近于1。
|
||||
*
|
||||
* <p>
|
||||
* see: http://blog.csdn.net/partner4java/article/details/9417663
|
||||
*
|
||||
*
|
||||
* @param blockingCoefficient 阻塞系数,阻塞因子介于0~1之间的数,阻塞因子越大,线程池中的线程数越多。
|
||||
* @return {@link ThreadPoolExecutor}
|
||||
* @since 3.0.6
|
||||
@@ -87,7 +87,7 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 直接在公共线程池中执行线程
|
||||
*
|
||||
*
|
||||
* @param runnable 可运行对象
|
||||
*/
|
||||
public static void execute(Runnable runnable) {
|
||||
@@ -96,7 +96,7 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 执行异步方法
|
||||
*
|
||||
*
|
||||
* @param runnable 需要执行的方法体
|
||||
* @param isDaemon 是否守护线程。守护线程会在主线程结束后自动结束
|
||||
* @return 执行的方法体
|
||||
@@ -117,8 +117,8 @@ public class ThreadUtil {
|
||||
/**
|
||||
* 执行有返回值的异步方法<br>
|
||||
* Future代表一个异步执行的操作,通过get()方法可以获得操作的结果,如果异步操作还没有完成,则,get()会使当前线程阻塞
|
||||
*
|
||||
* @param <T> 回调对象类型
|
||||
*
|
||||
* @param <T> 回调对象类型
|
||||
* @param task {@link Callable}
|
||||
* @return Future
|
||||
*/
|
||||
@@ -129,7 +129,7 @@ public class ThreadUtil {
|
||||
/**
|
||||
* 执行有返回值的异步方法<br>
|
||||
* Future代表一个异步执行的操作,通过get()方法可以获得操作的结果,如果异步操作还没有完成,则,get()会使当前线程阻塞
|
||||
*
|
||||
*
|
||||
* @param runnable 可运行对象
|
||||
* @return {@link Future}
|
||||
* @since 3.0.5
|
||||
@@ -141,7 +141,7 @@ public class ThreadUtil {
|
||||
/**
|
||||
* 新建一个CompletionService,调用其submit方法可以异步执行多个任务,最后调用take方法按照完成的顺序获得其结果。<br>
|
||||
* 若未完成,则会阻塞
|
||||
*
|
||||
*
|
||||
* @param <T> 回调对象类型
|
||||
* @return CompletionService
|
||||
*/
|
||||
@@ -152,8 +152,8 @@ public class ThreadUtil {
|
||||
/**
|
||||
* 新建一个CompletionService,调用其submit方法可以异步执行多个任务,最后调用take方法按照完成的顺序获得其结果。<br>
|
||||
* 若未完成,则会阻塞
|
||||
*
|
||||
* @param <T> 回调对象类型
|
||||
*
|
||||
* @param <T> 回调对象类型
|
||||
* @param executor 执行器 {@link ExecutorService}
|
||||
* @return CompletionService
|
||||
*/
|
||||
@@ -163,7 +163,7 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 新建一个CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
|
||||
*
|
||||
*
|
||||
* @param threadCount 线程数量
|
||||
* @return CountDownLatch
|
||||
*/
|
||||
@@ -173,9 +173,9 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 创建新线程,非守护线程,正常优先级,线程组与当前线程的线程组一致
|
||||
*
|
||||
*
|
||||
* @param runnable {@link Runnable}
|
||||
* @param name 线程名
|
||||
* @param name 线程名
|
||||
* @return {@link Thread}
|
||||
* @since 3.1.2
|
||||
*/
|
||||
@@ -189,9 +189,9 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 创建新线程
|
||||
*
|
||||
*
|
||||
* @param runnable {@link Runnable}
|
||||
* @param name 线程名
|
||||
* @param name 线程名
|
||||
* @param isDaemon 是否守护线程
|
||||
* @return {@link Thread}
|
||||
* @since 4.1.2
|
||||
@@ -204,8 +204,8 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 挂起当前线程
|
||||
*
|
||||
* @param timeout 挂起的时长
|
||||
*
|
||||
* @param timeout 挂起的时长
|
||||
* @param timeUnit 时长单位
|
||||
* @return 被中断返回false,否则true
|
||||
*/
|
||||
@@ -220,7 +220,7 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 挂起当前线程
|
||||
*
|
||||
*
|
||||
* @param millis 挂起的毫秒数
|
||||
* @return 被中断返回false,否则true
|
||||
*/
|
||||
@@ -239,10 +239,10 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 考虑{@link Thread#sleep(long)}方法有可能时间不足给定毫秒数,此方法保证sleep时间不小于给定的毫秒数
|
||||
*
|
||||
* @see ThreadUtil#sleep(Number)
|
||||
*
|
||||
* @param millis 给定的sleep时间
|
||||
* @return 被中断返回false,否则true
|
||||
* @see ThreadUtil#sleep(Number)
|
||||
*/
|
||||
public static boolean safeSleep(Number millis) {
|
||||
long millisLong = millis.longValue();
|
||||
@@ -267,7 +267,7 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 获得堆栈项
|
||||
*
|
||||
*
|
||||
* @param i 第几个堆栈项
|
||||
* @return 堆栈项
|
||||
*/
|
||||
@@ -281,8 +281,8 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 创建本地线程对象
|
||||
*
|
||||
* @param <T> 持有对象类型
|
||||
*
|
||||
* @param <T> 持有对象类型
|
||||
* @param isInheritable 是否为子线程提供从父线程那里继承的值
|
||||
* @return 本地线程
|
||||
*/
|
||||
@@ -296,7 +296,7 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 创建ThreadFactoryBuilder
|
||||
*
|
||||
*
|
||||
* @return ThreadFactoryBuilder
|
||||
* @see ThreadFactoryBuilder#build()
|
||||
* @since 4.1.13
|
||||
@@ -307,7 +307,7 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 结束线程,调用此方法后,线程将抛出 {@link InterruptedException}异常
|
||||
*
|
||||
*
|
||||
* @param thread 线程
|
||||
* @param isJoin 是否等待结束
|
||||
*/
|
||||
@@ -322,11 +322,11 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 等待线程结束. 调用 {@link Thread#join()} 并忽略 {@link InterruptedException}
|
||||
*
|
||||
*
|
||||
* @param thread 线程
|
||||
*/
|
||||
public static void waitForDie(Thread thread) {
|
||||
if(null == thread){
|
||||
if (null == thread) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -343,7 +343,7 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 获取JVM中与当前线程同组的所有线程<br>
|
||||
*
|
||||
*
|
||||
* @return 线程对象数组
|
||||
*/
|
||||
public static Thread[] getThreads() {
|
||||
@@ -354,7 +354,7 @@ public class ThreadUtil {
|
||||
* 获取JVM中与当前线程同组的所有线程<br>
|
||||
* 使用数组二次拷贝方式,防止在线程列表获取过程中线程终止<br>
|
||||
* from Voovan
|
||||
*
|
||||
*
|
||||
* @param group 线程组
|
||||
* @return 线程对象数组
|
||||
*/
|
||||
@@ -369,7 +369,7 @@ public class ThreadUtil {
|
||||
/**
|
||||
* 获取进程的主线程<br>
|
||||
* from Voovan
|
||||
*
|
||||
*
|
||||
* @return 进程的主线程
|
||||
*/
|
||||
public static Thread getMainThread() {
|
||||
@@ -383,7 +383,7 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 获取当前线程的线程组
|
||||
*
|
||||
*
|
||||
* @return 线程组
|
||||
* @since 3.1.2
|
||||
*/
|
||||
@@ -394,9 +394,10 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 创建线程工厂
|
||||
*
|
||||
* @param prefix 线程名前缀
|
||||
*
|
||||
* @param prefix 线程名前缀
|
||||
* @param isDaemon 是否守护线程
|
||||
* @return {@link ThreadFactory}
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public static ThreadFactory newNamedThreadFactory(String prefix, boolean isDaemon) {
|
||||
@@ -405,10 +406,11 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 创建线程工厂
|
||||
*
|
||||
* @param prefix 线程名前缀
|
||||
*
|
||||
* @param prefix 线程名前缀
|
||||
* @param threadGroup 线程组,可以为null
|
||||
* @param isDaemon 是否守护线程
|
||||
* @param isDaemon 是否守护线程
|
||||
* @return {@link ThreadFactory}
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public static ThreadFactory newNamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDaemon) {
|
||||
@@ -417,11 +419,12 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 创建线程工厂
|
||||
*
|
||||
* @param prefix 线程名前缀
|
||||
*
|
||||
* @param prefix 线程名前缀
|
||||
* @param threadGroup 线程组,可以为null
|
||||
* @param isDaemon 是否守护线程
|
||||
* @param handler 未捕获异常处理
|
||||
* @param isDaemon 是否守护线程
|
||||
* @param handler 未捕获异常处理
|
||||
* @return {@link ThreadFactory}
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public static ThreadFactory newNamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDaemon, UncaughtExceptionHandler handler) {
|
||||
@@ -430,7 +433,7 @@ public class ThreadUtil {
|
||||
|
||||
/**
|
||||
* 阻塞当前线程,保证在main方法中执行不被退出
|
||||
*
|
||||
*
|
||||
* @param obj 对象所在线程
|
||||
* @since 4.5.6
|
||||
*/
|
||||
@@ -449,9 +452,9 @@ public class ThreadUtil {
|
||||
* 此方法用于测试多线程下执行某些逻辑的并发性能<br>
|
||||
* 调用此方法会导致当前线程阻塞。<br>
|
||||
* 结束后可调用{@link ConcurrencyTester#getInterval()} 方法获取执行时间
|
||||
*
|
||||
*
|
||||
* @param threadSize 并发线程数
|
||||
* @param runnable 执行的逻辑实现
|
||||
* @param runnable 执行的逻辑实现
|
||||
* @return {@link ConcurrencyTester}
|
||||
* @since 4.5.8
|
||||
*/
|
||||
|
@@ -828,7 +828,8 @@ public class ArrayUtil {
|
||||
|
||||
/**
|
||||
* 去除{@code null} 元素
|
||||
*
|
||||
*
|
||||
* @param <T> 数组元素类型
|
||||
* @param array 数组
|
||||
* @return 处理后的数组
|
||||
* @since 3.2.2
|
||||
@@ -845,7 +846,8 @@ public class ArrayUtil {
|
||||
|
||||
/**
|
||||
* 去除{@code null}或者"" 元素
|
||||
*
|
||||
*
|
||||
* @param <T> 数组元素类型
|
||||
* @param array 数组
|
||||
* @return 处理后的数组
|
||||
* @since 3.2.2
|
||||
@@ -861,7 +863,8 @@ public class ArrayUtil {
|
||||
|
||||
/**
|
||||
* 去除{@code null}或者""或者空白字符串 元素
|
||||
*
|
||||
*
|
||||
* @param <T> 数组元素类型
|
||||
* @param array 数组
|
||||
* @return 处理后的数组
|
||||
* @since 3.2.2
|
||||
@@ -1900,7 +1903,8 @@ public class ArrayUtil {
|
||||
|
||||
/**
|
||||
* 获取子数组
|
||||
*
|
||||
*
|
||||
* @param <T> 数组元素类型
|
||||
* @param array 数组
|
||||
* @param start 开始位置(包括)
|
||||
* @param end 结束位置(不包括)
|
||||
@@ -3885,7 +3889,8 @@ public class ArrayUtil {
|
||||
/**
|
||||
* 去重数组中的元素,去重后生成新的数组,原数组不变<br>
|
||||
* 此方法通过{@link LinkedHashSet} 去重
|
||||
*
|
||||
*
|
||||
* @param <T> 数组元素类型
|
||||
* @param array 数组
|
||||
* @return 去重后的数组
|
||||
*/
|
||||
|
@@ -53,13 +53,13 @@ public class EnumUtil {
|
||||
/**
|
||||
* 字符串转枚举,调用{@link Enum#valueOf(Class, String)}
|
||||
*
|
||||
* @param <T> 枚举类型泛型
|
||||
* @param <E> 枚举类型泛型
|
||||
* @param enumClass 枚举类
|
||||
* @param value 值
|
||||
* @param value 值
|
||||
* @return 枚举值
|
||||
* @since 4.1.13
|
||||
*/
|
||||
public static <T extends Enum<T>> T fromString(Class<T> enumClass, String value) {
|
||||
public static <E extends Enum<E>> E fromString(Class<E> enumClass, String value) {
|
||||
return Enum.valueOf(enumClass, value);
|
||||
}
|
||||
|
||||
@@ -67,31 +67,31 @@ public class EnumUtil {
|
||||
* 字符串转枚举,调用{@link Enum#valueOf(Class, String)}<br>
|
||||
* 如果无枚举值,返回默认值
|
||||
*
|
||||
* @param <T> 枚举类型泛型
|
||||
* @param enumClass 枚举类
|
||||
* @param value 值
|
||||
* @param <E> 枚举类型泛型
|
||||
* @param enumClass 枚举类
|
||||
* @param value 值
|
||||
* @param defaultValue 无对应枚举值返回的默认值
|
||||
* @return 枚举值
|
||||
* @since 4.5.18
|
||||
*/
|
||||
public static <T extends Enum<T>> T fromString(Class<T> enumClass, String value, T defaultValue) {
|
||||
public static <E extends Enum<E>> E fromString(Class<E> enumClass, String value, E defaultValue) {
|
||||
return ObjectUtil.defaultIfNull(fromStringQuietly(enumClass, value), defaultValue);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 字符串转枚举,调用{@link Enum#valueOf(Class, String)},转换失败返回{@code null} 而非报错
|
||||
*
|
||||
* @param <T> 枚举类型泛型
|
||||
* @param <E> 枚举类型泛型
|
||||
* @param enumClass 枚举类
|
||||
* @param value 值
|
||||
* @param value 值
|
||||
* @return 枚举值
|
||||
* @since 4.5.18
|
||||
*/
|
||||
public static <T extends Enum<T>> T fromStringQuietly(Class<T> enumClass, String value) {
|
||||
if(null == enumClass || StrUtil.isBlank(value)) {
|
||||
public static <E extends Enum<E>> E fromStringQuietly(Class<E> enumClass, String value) {
|
||||
if (null == enumClass || StrUtil.isBlank(value)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
return fromString(enumClass, value);
|
||||
} catch (IllegalArgumentException e) {
|
||||
@@ -102,12 +102,13 @@ public class EnumUtil {
|
||||
/**
|
||||
* 模糊匹配转换为枚举,给定一个值,匹配枚举中定义的所有字段名(包括name属性),一旦匹配到返回这个枚举对象,否则返回null
|
||||
*
|
||||
* @param <E> 枚举类型
|
||||
* @param enumClass 枚举类
|
||||
* @param value 值
|
||||
* @param value 值
|
||||
* @return 匹配到的枚举对象,未匹配到返回null
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T extends Enum<T>> T likeValueOf(Class<T> enumClass, Object value) {
|
||||
public static <E extends Enum<E>> E likeValueOf(Class<E> enumClass, Object value) {
|
||||
if (value instanceof CharSequence) {
|
||||
value = value.toString().trim();
|
||||
}
|
||||
@@ -123,7 +124,7 @@ public class EnumUtil {
|
||||
}
|
||||
for (Enum<?> enumObj : enums) {
|
||||
if (ObjectUtil.equal(value, ReflectUtil.getFieldValue(enumObj, field))) {
|
||||
return (T) enumObj;
|
||||
return (E) enumObj;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -151,7 +152,7 @@ public class EnumUtil {
|
||||
/**
|
||||
* 获得枚举类中各枚举对象下指定字段的值
|
||||
*
|
||||
* @param clazz 枚举类
|
||||
* @param clazz 枚举类
|
||||
* @param fieldName 字段名,最终调用getXXX方法
|
||||
* @return 字段值列表
|
||||
*/
|
||||
@@ -199,6 +200,7 @@ public class EnumUtil {
|
||||
* 获取枚举字符串值和枚举对象的Map对应,使用LinkedHashMap保证有序<br>
|
||||
* 结果中键为枚举名,值为枚举对象
|
||||
*
|
||||
* @param <E> 枚举类型
|
||||
* @param enumClass 枚举类
|
||||
* @return 枚举字符串值和枚举对象的Map对应,使用LinkedHashMap保证有序
|
||||
* @since 4.0.2
|
||||
@@ -215,7 +217,7 @@ public class EnumUtil {
|
||||
* 获得枚举名对应指定字段值的Map<br>
|
||||
* 键为枚举名,值为字段值
|
||||
*
|
||||
* @param clazz 枚举类
|
||||
* @param clazz 枚举类
|
||||
* @param fieldName 字段名,最终调用getXXX方法
|
||||
* @return 枚举名对应指定字段值的Map
|
||||
*/
|
||||
@@ -234,9 +236,9 @@ public class EnumUtil {
|
||||
/**
|
||||
* 判断某个值是存在枚举中
|
||||
*
|
||||
* @param <E> 枚举类型
|
||||
* @param enumClass 枚举类
|
||||
* @param val 需要查找的值
|
||||
* @param <E>
|
||||
* @param val 需要查找的值
|
||||
* @return 是否存在
|
||||
*/
|
||||
public static <E extends Enum<E>> boolean contains(final Class<E> enumClass, String val) {
|
||||
@@ -246,9 +248,9 @@ public class EnumUtil {
|
||||
/**
|
||||
* 判断某个值是不存在枚举中
|
||||
*
|
||||
* @param <E> 枚举类型
|
||||
* @param enumClass 枚举类
|
||||
* @param val 需要查找的值
|
||||
* @param <E>
|
||||
* @param val 需要查找的值
|
||||
* @return 是否不存在
|
||||
*/
|
||||
public static <E extends Enum<E>> boolean notContains(final Class<E> enumClass, String val) {
|
||||
@@ -258,7 +260,7 @@ public class EnumUtil {
|
||||
/**
|
||||
* 忽略大小检查某个枚举值是否匹配指定值
|
||||
*
|
||||
* @param e 枚举值
|
||||
* @param e 枚举值
|
||||
* @param val 需要判断的值
|
||||
* @return 是非匹配
|
||||
*/
|
||||
@@ -269,7 +271,7 @@ public class EnumUtil {
|
||||
/**
|
||||
* 检查某个枚举值是否匹配指定值
|
||||
*
|
||||
* @param e 枚举值
|
||||
* @param e 枚举值
|
||||
* @param val 需要判断的值
|
||||
* @return 是非匹配
|
||||
*/
|
||||
|
@@ -466,7 +466,8 @@ public class RandomUtil {
|
||||
|
||||
/**
|
||||
* 带有权重的随机生成器
|
||||
*
|
||||
*
|
||||
* @param <T> 随机对象类型
|
||||
* @param weightObjs 带有权重的对象列表
|
||||
* @return {@link WeightRandom}
|
||||
* @since 4.0.3
|
||||
@@ -477,7 +478,8 @@ public class RandomUtil {
|
||||
|
||||
/**
|
||||
* 带有权重的随机生成器
|
||||
*
|
||||
*
|
||||
* @param <T> 随机对象类型
|
||||
* @param weightObjs 带有权重的对象列表
|
||||
* @return {@link WeightRandom}
|
||||
* @since 4.0.3
|
||||
|
@@ -830,6 +830,7 @@ public class ReflectUtil {
|
||||
*
|
||||
* @param <T> AccessibleObject的子类,比如Class、Method、Field等
|
||||
* @param accessibleObject 可设置访问权限的对象,比如Class、Method、Field等
|
||||
* @return 被设置可访问的对象
|
||||
* @since 4.6.8
|
||||
*/
|
||||
public static <T extends AccessibleObject> T setAccessible(T accessibleObject) {
|
||||
|
@@ -3495,11 +3495,13 @@ public class StrUtil {
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回字符串 searchStr 在字符串 str 中第 ordinal 次出现的位置。<br>
|
||||
* 如果 str=null 或 searchStr=null 或 ordinal<=0 则返回-1<br>
|
||||
* 返回字符串 searchStr 在字符串 str 中第 ordinal 次出现的位置。
|
||||
*
|
||||
* <p>
|
||||
* 如果 str=null 或 searchStr=null 或 ordinal≥0 则返回-1<br>
|
||||
* 此方法来自:Apache-Commons-Lang
|
||||
*
|
||||
* 栗子(*代表任意字符):
|
||||
* 例子(*代表任意字符):
|
||||
*
|
||||
* <pre>
|
||||
* StrUtil.ordinalIndexOf(null, *, *) = -1
|
||||
|
@@ -48,21 +48,25 @@ import cn.hutool.core.lang.Assert;
|
||||
* XML工具类<br>
|
||||
* 此工具使用w3c dom工具,不需要依赖第三方包。<br>
|
||||
* 工具类封装了XML文档的创建、读取、写出和部分XML操作
|
||||
*
|
||||
*
|
||||
* @author xiaoleilu
|
||||
*
|
||||
*/
|
||||
public class XmlUtil {
|
||||
|
||||
/** 在XML中无效的字符 正则 */
|
||||
/**
|
||||
* 在XML中无效的字符 正则
|
||||
*/
|
||||
public final static String INVALID_REGEX = "[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]";
|
||||
/** XML格式化输出默认缩进量 */
|
||||
/**
|
||||
* XML格式化输出默认缩进量
|
||||
*/
|
||||
public final static int INDENT_DEFAULT = 2;
|
||||
|
||||
// -------------------------------------------------------------------------------------- Read
|
||||
|
||||
/**
|
||||
* 读取解析XML文件
|
||||
*
|
||||
*
|
||||
* @param file XML文件
|
||||
* @return XML文档对象
|
||||
*/
|
||||
@@ -94,7 +98,7 @@ public class XmlUtil {
|
||||
* 读取解析XML文件<br>
|
||||
* 如果给定内容以“<”开头,表示这是一个XML内容,直接读取,否则按照路径处理<br>
|
||||
* 路径可以为相对路径,也可以是绝对路径,相对路径相对于ClassPath
|
||||
*
|
||||
*
|
||||
* @param pathOrContent 内容或路径
|
||||
* @return XML文档对象
|
||||
* @since 3.0.9
|
||||
@@ -109,7 +113,7 @@ public class XmlUtil {
|
||||
/**
|
||||
* 读取解析XML文件<br>
|
||||
* 编码在XML中定义
|
||||
*
|
||||
*
|
||||
* @param inputStream XML流
|
||||
* @return XML文档对象
|
||||
* @throws UtilException IO异常或转换异常
|
||||
@@ -121,7 +125,7 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 读取解析XML文件
|
||||
*
|
||||
*
|
||||
* @param reader XML流
|
||||
* @return XML文档对象
|
||||
* @throws UtilException IO异常或转换异常
|
||||
@@ -134,7 +138,7 @@ public class XmlUtil {
|
||||
/**
|
||||
* 读取解析XML文件<br>
|
||||
* 编码在XML中定义
|
||||
*
|
||||
*
|
||||
* @param source {@link InputSource}
|
||||
* @return XML文档对象
|
||||
* @since 3.0.9
|
||||
@@ -150,7 +154,7 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 将String类型的XML转换为XML文档
|
||||
*
|
||||
*
|
||||
* @param xmlStr XML字符串
|
||||
* @return XML文档
|
||||
*/
|
||||
@@ -164,8 +168,8 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 从XML中读取对象 Reads serialized object from the XML file.
|
||||
*
|
||||
* @param <T> 对象类型
|
||||
*
|
||||
* @param <T> 对象类型
|
||||
* @param source XML文件
|
||||
* @return 对象
|
||||
*/
|
||||
@@ -175,8 +179,8 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 从XML中读取对象 Reads serialized object from the XML file.
|
||||
*
|
||||
* @param <T> 对象类型
|
||||
*
|
||||
* @param <T> 对象类型
|
||||
* @param xmlStr XML内容
|
||||
* @return 对象
|
||||
* @since 3.2.0
|
||||
@@ -187,8 +191,8 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 从XML中读取对象 Reads serialized object from the XML file.
|
||||
*
|
||||
* @param <T> 对象类型
|
||||
*
|
||||
* @param <T> 对象类型
|
||||
* @param source {@link InputSource}
|
||||
* @return 对象
|
||||
* @since 3.2.0
|
||||
@@ -207,11 +211,12 @@ public class XmlUtil {
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------- Write
|
||||
|
||||
/**
|
||||
* 将XML文档转换为String<br>
|
||||
* 字符编码使用XML文档中的编码,获取不到则使用UTF-8<br>
|
||||
* 默认非格式化输出,若想格式化请使用{@link #format(Document)}
|
||||
*
|
||||
*
|
||||
* @param doc XML文档
|
||||
* @return XML字符串
|
||||
*/
|
||||
@@ -222,8 +227,8 @@ public class XmlUtil {
|
||||
/**
|
||||
* 将XML文档转换为String<br>
|
||||
* 字符编码使用XML文档中的编码,获取不到则使用UTF-8
|
||||
*
|
||||
* @param doc XML文档
|
||||
*
|
||||
* @param doc XML文档
|
||||
* @param isPretty 是否格式化输出
|
||||
* @return XML字符串
|
||||
* @since 3.0.9
|
||||
@@ -235,9 +240,9 @@ public class XmlUtil {
|
||||
/**
|
||||
* 将XML文档转换为String<br>
|
||||
* 字符编码使用XML文档中的编码,获取不到则使用UTF-8
|
||||
*
|
||||
* @param doc XML文档
|
||||
* @param charset 编码
|
||||
*
|
||||
* @param doc XML文档
|
||||
* @param charset 编码
|
||||
* @param isPretty 是否格式化输出
|
||||
* @return XML字符串
|
||||
* @since 3.0.9
|
||||
@@ -254,7 +259,7 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 格式化XML输出
|
||||
*
|
||||
*
|
||||
* @param doc {@link Document} XML文档
|
||||
* @return 格式化后的XML字符串
|
||||
* @since 4.4.5
|
||||
@@ -265,7 +270,7 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 格式化XML输出
|
||||
*
|
||||
*
|
||||
* @param xmlStr XML字符串
|
||||
* @return 格式化后的XML字符串
|
||||
* @since 4.4.5
|
||||
@@ -277,8 +282,8 @@ public class XmlUtil {
|
||||
/**
|
||||
* 将XML文档写入到文件<br>
|
||||
* 使用Document中的编码
|
||||
*
|
||||
* @param doc XML文档
|
||||
*
|
||||
* @param doc XML文档
|
||||
* @param absolutePath 文件绝对路径,不存在会自动创建
|
||||
*/
|
||||
public static void toFile(Document doc, String absolutePath) {
|
||||
@@ -287,9 +292,9 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 将XML文档写入到文件<br>
|
||||
*
|
||||
* @param doc XML文档
|
||||
* @param path 文件路径绝对路径或相对ClassPath路径,不存在会自动创建
|
||||
*
|
||||
* @param doc XML文档
|
||||
* @param path 文件路径绝对路径或相对ClassPath路径,不存在会自动创建
|
||||
* @param charset 自定义XML文件的编码,如果为{@code null} 读取XML文档中的编码,否则默认UTF-8
|
||||
*/
|
||||
public static void toFile(Document doc, String path, String charset) {
|
||||
@@ -311,11 +316,11 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 将XML文档写出
|
||||
*
|
||||
* @param node {@link Node} XML文档节点或文档本身
|
||||
* @param writer 写出的Writer,Writer决定了输出XML的编码
|
||||
*
|
||||
* @param node {@link Node} XML文档节点或文档本身
|
||||
* @param writer 写出的Writer,Writer决定了输出XML的编码
|
||||
* @param charset 编码
|
||||
* @param indent 格式化输出中缩进量,小于1表示不格式化输出
|
||||
* @param indent 格式化输出中缩进量,小于1表示不格式化输出
|
||||
* @since 3.0.9
|
||||
*/
|
||||
public static void write(Node node, Writer writer, String charset, int indent) {
|
||||
@@ -324,11 +329,11 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 将XML文档写出
|
||||
*
|
||||
* @param node {@link Node} XML文档节点或文档本身
|
||||
* @param out 写出的Writer,Writer决定了输出XML的编码
|
||||
*
|
||||
* @param node {@link Node} XML文档节点或文档本身
|
||||
* @param out 写出的Writer,Writer决定了输出XML的编码
|
||||
* @param charset 编码
|
||||
* @param indent 格式化输出中缩进量,小于1表示不格式化输出
|
||||
* @param indent 格式化输出中缩进量,小于1表示不格式化输出
|
||||
* @since 4.0.8
|
||||
*/
|
||||
public static void write(Node node, OutputStream out, String charset, int indent) {
|
||||
@@ -338,11 +343,11 @@ public class XmlUtil {
|
||||
/**
|
||||
* 将XML文档写出<br>
|
||||
* 格式化输出逻辑参考:https://stackoverflow.com/questions/139076/how-to-pretty-print-xml-from-java
|
||||
*
|
||||
* @param source 源
|
||||
* @param result 目标
|
||||
*
|
||||
* @param source 源
|
||||
* @param result 目标
|
||||
* @param charset 编码
|
||||
* @param indent 格式化输出中缩进量,小于1表示不格式化输出
|
||||
* @param indent 格式化输出中缩进量,小于1表示不格式化输出
|
||||
* @since 4.0.9
|
||||
*/
|
||||
public static void transform(Source source, Result result, String charset, int indent) {
|
||||
@@ -363,10 +368,11 @@ public class XmlUtil {
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------- Create
|
||||
|
||||
/**
|
||||
* 创建XML文档<br>
|
||||
* 创建的XML默认是utf8编码,修改编码的过程是在toStr和toFile方法里,即XML在转为文本的时候才定义编码
|
||||
*
|
||||
*
|
||||
* @return XML文档
|
||||
* @since 4.0.8
|
||||
*/
|
||||
@@ -376,7 +382,7 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 创建 DocumentBuilder
|
||||
*
|
||||
*
|
||||
* @return DocumentBuilder
|
||||
* @since 4.1.2
|
||||
*/
|
||||
@@ -395,7 +401,7 @@ public class XmlUtil {
|
||||
/**
|
||||
* 创建XML文档<br>
|
||||
* 创建的XML默认是utf8编码,修改编码的过程是在toStr和toFile方法里,即XML在转为文本的时候才定义编码
|
||||
*
|
||||
*
|
||||
* @param rootElementName 根节点名称
|
||||
* @return XML文档
|
||||
*/
|
||||
@@ -407,9 +413,10 @@ public class XmlUtil {
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------- Function
|
||||
|
||||
/**
|
||||
* 获得XML文档根节点
|
||||
*
|
||||
*
|
||||
* @param doc {@link Document}
|
||||
* @return 根节点
|
||||
* @see Document#getDocumentElement()
|
||||
@@ -421,7 +428,7 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 去除XML文本中的无效字符
|
||||
*
|
||||
*
|
||||
* @param xmlContent XML文本
|
||||
* @return 当传入为null时返回null
|
||||
*/
|
||||
@@ -434,7 +441,7 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 根据节点名获得子节点列表
|
||||
*
|
||||
*
|
||||
* @param element 节点
|
||||
* @param tagName 节点名,如果节点名为空(null或blank),返回所有子节点
|
||||
* @return 节点列表
|
||||
@@ -446,7 +453,7 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 根据节点名获得第一个子节点
|
||||
*
|
||||
*
|
||||
* @param element 节点
|
||||
* @param tagName 节点名
|
||||
* @return 节点
|
||||
@@ -468,7 +475,7 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 根据节点名获得第一个子节点
|
||||
*
|
||||
*
|
||||
* @param element 节点
|
||||
* @param tagName 节点名
|
||||
* @return 节点中的值
|
||||
@@ -480,9 +487,9 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 根据节点名获得第一个子节点
|
||||
*
|
||||
* @param element 节点
|
||||
* @param tagName 节点名
|
||||
*
|
||||
* @param element 节点
|
||||
* @param tagName 节点名
|
||||
* @param defaultValue 默认值
|
||||
* @return 节点中的值
|
||||
*/
|
||||
@@ -493,7 +500,7 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 将NodeList转换为Element列表
|
||||
*
|
||||
*
|
||||
* @param nodeList NodeList
|
||||
* @return Element列表
|
||||
*/
|
||||
@@ -504,9 +511,9 @@ public class XmlUtil {
|
||||
/**
|
||||
* 将NodeList转换为Element列表<br>
|
||||
* 非Element节点将被忽略
|
||||
*
|
||||
*
|
||||
* @param parentEle 父节点,如果指定将返回此节点的所有直接子节点,null返回所有就节点
|
||||
* @param nodeList NodeList
|
||||
* @param nodeList NodeList
|
||||
* @return Element列表
|
||||
*/
|
||||
public static List<Element> transElements(Element parentEle, NodeList nodeList) {
|
||||
@@ -530,7 +537,7 @@ public class XmlUtil {
|
||||
/**
|
||||
* 将可序列化的对象转换为XML写入文件,已经存在的文件将被覆盖<br>
|
||||
* Writes serializable object to a XML file. Existing file will be overwritten
|
||||
*
|
||||
*
|
||||
* @param dest 目标文件
|
||||
* @param bean 对象
|
||||
*/
|
||||
@@ -548,7 +555,7 @@ public class XmlUtil {
|
||||
/**
|
||||
* 创建XPath<br>
|
||||
* Xpath相关文章:https://www.ibm.com/developerworks/cn/xml/x-javaxpathapi.html
|
||||
*
|
||||
*
|
||||
* @return {@link XPath}
|
||||
* @since 3.2.0
|
||||
*/
|
||||
@@ -559,9 +566,9 @@ public class XmlUtil {
|
||||
/**
|
||||
* 通过XPath方式读取XML节点等信息<br>
|
||||
* Xpath相关文章:https://www.ibm.com/developerworks/cn/xml/x-javaxpathapi.html
|
||||
*
|
||||
*
|
||||
* @param expression XPath表达式
|
||||
* @param source 资源,可以是Docunent、Node节点等
|
||||
* @param source 资源,可以是Docunent、Node节点等
|
||||
* @return 匹配返回类型的值
|
||||
* @since 4.0.9
|
||||
*/
|
||||
@@ -572,9 +579,9 @@ public class XmlUtil {
|
||||
/**
|
||||
* 通过XPath方式读取XML的NodeList<br>
|
||||
* Xpath相关文章:https://www.ibm.com/developerworks/cn/xml/x-javaxpathapi.html
|
||||
*
|
||||
*
|
||||
* @param expression XPath表达式
|
||||
* @param source 资源,可以是Docunent、Node节点等
|
||||
* @param source 资源,可以是Docunent、Node节点等
|
||||
* @return NodeList
|
||||
* @since 4.0.9
|
||||
*/
|
||||
@@ -585,9 +592,9 @@ public class XmlUtil {
|
||||
/**
|
||||
* 通过XPath方式读取XML节点等信息<br>
|
||||
* Xpath相关文章:https://www.ibm.com/developerworks/cn/xml/x-javaxpathapi.html
|
||||
*
|
||||
*
|
||||
* @param expression XPath表达式
|
||||
* @param source 资源,可以是Docunent、Node节点等
|
||||
* @param source 资源,可以是Docunent、Node节点等
|
||||
* @return 匹配返回类型的值
|
||||
* @since 4.0.9
|
||||
*/
|
||||
@@ -598,9 +605,9 @@ public class XmlUtil {
|
||||
/**
|
||||
* 通过XPath方式读取XML节点等信息<br>
|
||||
* Xpath相关文章:https://www.ibm.com/developerworks/cn/xml/x-javaxpathapi.html
|
||||
*
|
||||
*
|
||||
* @param expression XPath表达式
|
||||
* @param source 资源,可以是Docunent、Node节点等
|
||||
* @param source 资源,可以是Docunent、Node节点等
|
||||
* @param returnType 返回类型,{@link javax.xml.xpath.XPathConstants}
|
||||
* @return 匹配返回类型的值
|
||||
* @since 3.2.0
|
||||
@@ -620,14 +627,14 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 转义XML特殊字符:
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* & (ampersand) 替换为 &amp;
|
||||
* < (小于) 替换为 &lt;
|
||||
* > (大于) 替换为 &gt;
|
||||
* " (双引号) 替换为 &quot;
|
||||
* </pre>
|
||||
*
|
||||
*
|
||||
* @param string 被替换的字符串
|
||||
* @return 替换后的字符串
|
||||
* @since 4.0.8
|
||||
@@ -637,23 +644,23 @@ public class XmlUtil {
|
||||
for (int i = 0, length = string.length(); i < length; i++) {
|
||||
char c = string.charAt(i);
|
||||
switch (c) {
|
||||
case '&':
|
||||
sb.append("&");
|
||||
break;
|
||||
case '<':
|
||||
sb.append("<");
|
||||
break;
|
||||
case '>':
|
||||
sb.append(">");
|
||||
break;
|
||||
case '"':
|
||||
sb.append(""");
|
||||
break;
|
||||
case '\'':
|
||||
sb.append("'");
|
||||
break;
|
||||
default:
|
||||
sb.append(c);
|
||||
case '&':
|
||||
sb.append("&");
|
||||
break;
|
||||
case '<':
|
||||
sb.append("<");
|
||||
break;
|
||||
case '>':
|
||||
sb.append(">");
|
||||
break;
|
||||
case '"':
|
||||
sb.append(""");
|
||||
break;
|
||||
case '\'':
|
||||
sb.append("'");
|
||||
break;
|
||||
default:
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
@@ -701,7 +708,7 @@ public class XmlUtil {
|
||||
/**
|
||||
* XML节点转换为Map
|
||||
*
|
||||
* @param node XML节点
|
||||
* @param node XML节点
|
||||
* @param result 结果Map类型
|
||||
* @return XML数据转换后的Map
|
||||
* @since 4.0.8
|
||||
@@ -728,7 +735,8 @@ public class XmlUtil {
|
||||
/**
|
||||
* 将Map转换为XML格式的字符串
|
||||
*
|
||||
* @param data Map类型数据
|
||||
* @param data Map类型数据
|
||||
* @param rootName 根节点名
|
||||
* @return XML格式的字符串
|
||||
* @since 4.0.8
|
||||
*/
|
||||
@@ -739,7 +747,8 @@ public class XmlUtil {
|
||||
/**
|
||||
* 将Map转换为XML
|
||||
*
|
||||
* @param data Map类型数据
|
||||
* @param data Map类型数据
|
||||
* @param rootName 根节点名
|
||||
* @return XML
|
||||
* @since 4.0.9
|
||||
*/
|
||||
@@ -753,7 +762,7 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 给定节点是否为{@link Element} 类型节点
|
||||
*
|
||||
*
|
||||
* @param node 节点
|
||||
* @return 是否为{@link Element} 类型节点
|
||||
* @since 4.0.8
|
||||
@@ -764,8 +773,8 @@ public class XmlUtil {
|
||||
|
||||
/**
|
||||
* 在已有节点上创建子节点
|
||||
*
|
||||
* @param node 节点
|
||||
*
|
||||
* @param node 节点
|
||||
* @param tagName 标签名
|
||||
* @return 子节点
|
||||
* @since 4.0.9
|
||||
@@ -778,12 +787,13 @@ public class XmlUtil {
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------- Private method start
|
||||
|
||||
/**
|
||||
* 将Map转换为XML格式的字符串
|
||||
*
|
||||
* @param doc {@link Document}
|
||||
* @param doc {@link Document}
|
||||
* @param element 节点
|
||||
* @param data Map类型数据
|
||||
* @param data Map类型数据
|
||||
* @since 4.0.8
|
||||
*/
|
||||
private static void mapToXml(Document doc, Element element, Map<?, ?> data) {
|
||||
@@ -813,7 +823,7 @@ public class XmlUtil {
|
||||
/**
|
||||
* 关闭XXE,避免漏洞攻击<br>
|
||||
* see: https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#JAXP_DocumentBuilderFactory.2C_SAXParserFactory_and_DOM4J
|
||||
*
|
||||
*
|
||||
* @param dbf DocumentBuilderFactory
|
||||
* @return DocumentBuilderFactory
|
||||
*/
|
||||
|
Reference in New Issue
Block a user