fix comment

This commit is contained in:
Looly
2019-10-08 18:16:30 +08:00
parent 1364656855
commit 0685a8a141
55 changed files with 2334 additions and 2106 deletions

View File

@@ -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();
}
/**

View File

@@ -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) {

View File

@@ -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 解密后的字符
*/

View File

@@ -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 &lt; c2返回数小于0c1==c2返回0c1 &gt; 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 &lt; c2返回数小于0c1==c2返回0c1 &gt; 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 &lt; c2返回数小于0c1==c2返回0c1 &gt; 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 &lt; o2返回数小于0o1==o2返回0o1 &gt; 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;
}
}

View File

@@ -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) {

View File

@@ -528,6 +528,8 @@ public class Convert {
*
* @param <K> 键类型
* @param <V> 值类型
* @param keyType 键类型
* @param valueType 值类型
* @param value 被转换的值
* @return {@link Map}
* @since 4.6.8

View File

@@ -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()
*/

View File

@@ -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();

View File

@@ -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 矩形对象表示矩形区域的xywidthheight
* @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 矩形对象表示矩形区域的xywidthheightx,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 矩形对象表示矩形区域的xywidthheightx,y从背景图片中心计算
* @param img 要绘制的图片
* @param rectangle 矩形对象表示矩形区域的xywidthheightx,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

View File

@@ -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 目录或文件

View 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) {

View File

@@ -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();

View File

@@ -442,7 +442,7 @@ public class WatchMonitor extends Thread implements Closeable, Serializable {
}
/**
* 设置监听选项,例如监听频率等,可设置项包括:<p>
* 设置监听选项,例如监听频率等,可设置项包括:
*
* <pre>
* 1、com.sun.nio.file.StandardWatchEventKinds

View File

@@ -525,14 +525,14 @@ public class Assert {
* 检查下标(数组、集合、字符串)是否符合要求,下标必须满足:
*
* <pre>
* 0 <= index < size
* 0 &le; index &lt; size
* </pre>
*
* @param index 下标
* @param size 长度
* @return 检查后的下标
* @throws IllegalArgumentException 如果size < 0 抛出此异常
* @throws IndexOutOfBoundsException 如果index < 0或者 index >= size 抛出此异常
* @throws IllegalArgumentException 如果size &lt; 0 抛出此异常
* @throws IndexOutOfBoundsException 如果index &lt; 0或者 index &ge; 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 &le; index &lt; 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 &lt; 0 抛出此异常
* @throws IndexOutOfBoundsException 如果index &lt; 0或者 index &ge; size 抛出此异常
* @since 4.1.9
*/
public static int checkIndex(int index, int size, String errorMsgTemplate, Object... params) throws IllegalArgumentException, IndexOutOfBoundsException {

View File

@@ -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

View File

@@ -11,22 +11,21 @@ import cn.hutool.core.util.StrUtil;
/**
* 提供通用唯一识别码universally unique identifierUUID实现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 值
*/

View File

@@ -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 {
/**
* 验证是否为Hex16进制字符串
*
*
* @param value 值
* @return 是否为Hex16进制字符串
* @since 4.3.3
@@ -1017,9 +1052,9 @@ public class Validator {
/**
* 验证是否为Hex16进制字符串
*
* @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

View File

@@ -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);
}
}

View File

@@ -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

View File

@@ -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 {
/**
* 新建TreeMapKey有序的Map
*
*
* @param <K> key的类型
* @param <V> value的类型
* @param comparator Key比较器
* @return TreeMap
* @since 3.2.3
@@ -140,8 +147,10 @@ public class MapUtil {
/**
* 新建TreeMapKey有序的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 {
/**
* 将数组转换为MapHashMap支持数组元素类型为
*
*
* <pre>
* Map.Entry
* 长度大于1的数组取前两个值如果不满足跳过此元素
* Iterable 长度也必须大于1取前两个值如果不满足跳过此元素
* Iterator 长度也必须大于1取前两个值如果不满足跳过此元素
* </pre>
*
*
* <pre>
* Map&lt;Object, Object&gt; 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 {
/**
* 排序已有MapKey有序的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 {
/**
* 排序已有MapKey有序的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;
}
}

View File

@@ -21,7 +21,7 @@ public class LocalPortGenerater implements Serializable{
/**
* 构造
*
* @param beginPort
* @param beginPort 起始端口号
*/
public LocalPortGenerater(int beginPort) {
alternativePort = new AtomicInteger(beginPort);

View File

@@ -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);
}
/**

View File

@@ -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 对之间放置 &amp; 符号。
* </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 = "!" / "$" / "&amp;" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
* </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 '&amp;' 不编码
* 其它编码为 %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 = "!" / "$" / "&amp;" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
* </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 '&amp;' 不编码
* 其它编码为 %nn 形式
* </pre>
*

View File

@@ -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
*/

View File

@@ -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);

View File

@@ -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 &gt; end抛出此异常
*/
public StrBuilder del(int start, int end) throws StringIndexOutOfBoundsException {
if (start < 0) {

View File

@@ -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}

View File

@@ -4,12 +4,12 @@ import cn.hutool.core.date.TimeInterval;
/**
* 高并发测试工具类
*
*
* <pre>
* ps:
* //模拟1000个线程并发
* ConcurrencyTester ct = new ConcurrencyTester(1000);
* ct.test(() -> {
* ct.test(() -&gt; {
* // 需要并发测试的业务代码
* });
* </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() {

View File

@@ -16,7 +16,7 @@ import cn.hutool.core.exceptions.UtilException;
* ps:
* //模拟1000个线程并发
* SyncFinisher sf = new SyncFinisher(1000);
* concurrencyTestUtil.run(() -> {
* concurrencyTestUtil.run(() -&gt; {
* // 需要并发测试的业务代码
* });
* </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<>();
}
/**

View File

@@ -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
*/

View File

@@ -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 去重后的数组
*/

View File

@@ -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 是非匹配
*/

View File

@@ -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

View File

@@ -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) {

View File

@@ -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&ge;0 则返回-1<br>
* 此方法来自Apache-Commons-Lang
*
* 子(*代表任意字符):
* 子(*代表任意字符):
*
* <pre>
* StrUtil.ordinalIndexOf(null, *, *) = -1

View File

@@ -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>
* 如果给定内容以“&lt;”开头表示这是一个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 写出的WriterWriter决定了输出XML的编码
*
* @param node {@link Node} XML文档节点或文档本身
* @param writer 写出的WriterWriter决定了输出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 写出的WriterWriter决定了输出XML的编码
*
* @param node {@link Node} XML文档节点或文档本身
* @param out 写出的WriterWriter决定了输出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>
* &amp; (ampersand) 替换为 &amp;amp;
* &lt; (小于) 替换为 &amp;lt;
* &gt; (大于) 替换为 &amp;gt;
* &quot; (双引号) 替换为 &amp;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("&amp;");
break;
case '<':
sb.append("&lt;");
break;
case '>':
sb.append("&gt;");
break;
case '"':
sb.append("&quot;");
break;
case '\'':
sb.append("&apos;");
break;
default:
sb.append(c);
case '&':
sb.append("&amp;");
break;
case '<':
sb.append("&lt;");
break;
case '>':
sb.append("&gt;");
break;
case '"':
sb.append("&quot;");
break;
case '\'':
sb.append("&apos;");
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
*/