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

@@ -5,7 +5,6 @@ package cn.hutool.core.codec;
* 算法来自https://github.com/zhaorenjie110/SymmetricEncryptionAndDecryption
*
* @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 加密后的字符
*/

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)
*/
@@ -18,9 +43,9 @@ 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)
@@ -46,12 +71,13 @@ public class CompareUtil {
* 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;
@@ -61,17 +87,17 @@ public class CompareUtil {
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());
}

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

@@ -63,6 +63,7 @@ public class ExceptionUtil {
/**
* 包装一个异常
*
* @param <T> 被包装的异常类型
* @param throwable 异常
* @param wrapThrowable 包装后的异常类
* @return 包装后的异常
@@ -124,6 +125,7 @@ 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

@@ -45,16 +45,22 @@ 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;
/**
@@ -154,6 +160,7 @@ public class Img implements Serializable{
* 计算x,y坐标的时候是否从中心做为原始坐标开始计算
*
* @param positionBaseCentre 是否从中心做为原始坐标开始计算
* @return this
* @since 4.1.15
*/
public Img setPositionBaseCentre(boolean positionBaseCentre) {
@@ -165,6 +172,7 @@ 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) {
@@ -175,6 +183,7 @@ 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) {
@@ -219,7 +228,7 @@ public class Img implements Serializable{
* 缩放图像(按长宽缩放)<br>
* 注意:目标长宽与原图不成比例会变形
*
* @param width 目标宽度
* @param width 目标宽度
* @param height 目标高度
* @return this
*/
@@ -257,8 +266,8 @@ public class Img implements Serializable{
* 等比缩放图像,此方法按照按照给定的长宽等比缩放图片,按照长宽缩放比最多的一边等比缩放,空白部分填充背景色<br>
* 缩放后默认为jpeg格式
*
* @param width 缩放后的宽度
* @param height 缩放后的高度
* @param width 缩放后的宽度
* @param height 缩放后的高度
* @param fixedColor 比例不对时补充的颜色,不补充为<code>null</code>
* @return this
*/
@@ -334,8 +343,8 @@ 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
@@ -415,11 +424,11 @@ public class Img implements Serializable{
* 此方法并不关闭流
*
* @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) {
@@ -452,9 +461,9 @@ 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) {
@@ -467,9 +476,9 @@ 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
*/
@@ -525,6 +534,7 @@ public class Img implements Serializable{
}
// ----------------------------------------------------------------------------------------------------------------- Write
/**
* 获取处理过的图片
*
@@ -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) {
@@ -614,10 +625,10 @@ public class Img implements Serializable{
*/
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;
}
}
@@ -633,8 +644,8 @@ 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
@@ -653,16 +664,16 @@ 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

@@ -18,7 +18,6 @@ import cn.hutool.core.util.URLUtil;
* 外部Jar的类加载器
*
* @author Looly
*
*/
public class JarClassLoader extends URLClassLoader {
@@ -50,7 +49,7 @@ 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) {
@@ -82,11 +81,12 @@ public class JarClassLoader extends URLClassLoader {
}
// ------------------------------------------------------------------- Constructor start
/**
* 构造
*/
public JarClassLoader() {
this(new URL[] {});
this(new URL[]{});
}
/**
@@ -106,7 +106,7 @@ public class JarClassLoader extends URLClassLoader {
* @return this
*/
public JarClassLoader addJar(File jarFileOrDir) {
if(isJarFile(jarFileOrDir)) {
if (isJarFile(jarFileOrDir)) {
return addURL(jarFileOrDir);
}
final List<File> jars = loopJar(jarFileOrDir);
@@ -126,6 +126,7 @@ public class JarClassLoader extends URLClassLoader {
* 如果为目录此目录用于搜索class文件如果为文件需为jar文件
*
* @param dir 目录
* @return this
* @since 4.4.2
*/
public JarClassLoader addURL(File dir) {
@@ -134,6 +135,7 @@ public class JarClassLoader extends URLClassLoader {
}
// ------------------------------------------------------------------- Private method start
/**
* 递归获得Jar文件
*

View File

@@ -15,7 +15,6 @@ import cn.hutool.core.util.StrUtil;
* <p>
* 这些通用标识符具有不同的变体。此类的方法用于操作 Leach-Salz 变体,不过构造方法允许创建任何 UUID 变体(将在下面进行描述)。
* <p>
*
* 变体 2 (Leach-Salz) UUID 的布局如下: long 型数据的最高有效位由以下无符号字段组成:
*
* <pre>
@@ -24,7 +23,7 @@ import cn.hutool.core.util.StrUtil;
* 0x000000000000F000 version
* 0x0000000000000FFF time_hi
* </pre>
*
* <p>
* long 型数据的最低有效位由以下无符号字段组成:
*
* <pre>
@@ -48,16 +47,19 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
* {@link SecureRandom} 的单例
*
* @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;
/**
@@ -82,7 +84,7 @@ 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) {
@@ -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 {
@@ -312,8 +311,6 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
* }
* </pre>
*
* </blockquote>
*
* @return 此{@code UUID} 的字符串表现形式
* @see #toString(boolean)
*/
@@ -341,8 +338,6 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
* }
* </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

@@ -15,46 +15,79 @@ import cn.hutool.core.util.StrUtil;
* 字段验证器
*
* @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;
/**
@@ -82,9 +115,9 @@ public class Validator {
/**
* 检查指定值是否为<code>true</code>
*
* @param value 值
* @param value
* @param errorMsgTemplate 错误消息内容模板(变量使用{}表示)
* @param params 模板中变量替换后的值
* @param params 模板中变量替换后的值
* @return 检查过后的值
* @throws ValidateException 检查不满足条件抛出的异常
* @since 4.4.5
@@ -99,9 +132,9 @@ public class Validator {
/**
* 检查指定值是否为<code>false</code>
*
* @param value 值
* @param value
* @param errorMsgTemplate 错误消息内容模板(变量使用{}表示)
* @param params 模板中变量替换后的值
* @param params 模板中变量替换后的值
* @return 检查过后的值
* @throws ValidateException 检查不满足条件抛出的异常
* @since 4.4.5
@@ -136,10 +169,10 @@ 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
@@ -154,10 +187,10 @@ public class Validator {
/**
* 检查指定值是否非<code>null</code>
*
* @param <T> 被检查的对象类型
* @param value 值
* @param <T> 被检查的对象类型
* @param value
* @param errorMsgTemplate 错误消息内容模板(变量使用{}表示)
* @param params 模板中变量替换后的值
* @param params 模板中变量替换后的值
* @return 检查过后的值
* @throws ValidateException 检查不满足条件抛出的异常
*/
@@ -194,7 +227,8 @@ public class Validator {
* 验证是否为空,非空时抛出异常<br>
* 对于String类型判定是否为empty(null 或 "")<br>
*
* @param value 值
* @param <T> 值类型
* @param value 值
* @param errorMsg 验证错误的信息
* @return 验证后的值,验证通过返回此值,空值
* @throws ValidateException 验证异常
@@ -210,7 +244,8 @@ public class Validator {
* 验证是否为非空,为空时抛出异常<br>
* 对于String类型判定是否为empty(null 或 "")<br>
*
* @param value 值
* @param <T> 值类型
* @param value 值
* @param errorMsg 验证错误的信息
* @return 验证后的值,验证通过返回此值,非空值
* @throws ValidateException 验证异常
@@ -237,8 +272,8 @@ public class Validator {
/**
* 验证是否相等,不相等抛出异常<br>
*
* @param t1 对象1
* @param t2 对象2
* @param t1 对象1
* @param t2 对象2
* @param errorMsg 错误信息
* @return 相同值
* @throws ValidateException 验证异常
@@ -253,8 +288,8 @@ public class Validator {
/**
* 验证是否不等,相等抛出异常<br>
*
* @param t1 对象1
* @param t2 对象2
* @param t1 对象1
* @param t2 对象2
* @param errorMsg 错误信息
* @throws ValidateException 验证异常
*/
@@ -269,8 +304,8 @@ public class Validator {
* 当数据为空时抛出验证异常<br>
* 当两值不等时抛出异常
*
* @param t1 对象1
* @param t2 对象2
* @param t1 对象1
* @param t2 对象2
* @param errorMsg 错误信息
* @throws ValidateException 验证异常
*/
@@ -284,8 +319,8 @@ public class Validator {
* 当数据为空时抛出验证异常<br>
* 当两值相等时抛出异常
*
* @param t1 对象1
* @param t2 对象2
* @param t1 对象1
* @param t2 对象2
* @param errorMsg 错误信息
* @throws ValidateException 验证异常
*/
@@ -309,9 +344,9 @@ public class Validator {
* 通过正则表达式验证<br>
* 不符合正则抛出{@link ValidateException} 异常
*
* @param <T> 字符串类型
* @param regex 正则
* @param value 值
* @param <T> 字符串类型
* @param regex 正则
* @param value
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -327,7 +362,7 @@ public class Validator {
* 通过正则表达式验证
*
* @param pattern 正则模式
* @param value 值
* @param value
* @return 是否匹配正则
*/
public static boolean isMactchRegex(Pattern pattern, CharSequence value) {
@@ -347,8 +382,8 @@ public class Validator {
/**
* 验证是否为英文字母 、数字和下划线
*
* @param <T> 字符串类型
* @param value 值
* @param <T> 字符串类型
* @param value
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -364,8 +399,8 @@ 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) {
@@ -382,10 +417,10 @@ 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 验证异常
@@ -401,7 +436,7 @@ public class Validator {
* 验证是否为给定最小长度的英文字母 、数字和下划线
*
* @param value 值
* @param min 最小长度负数自动识别为0
* @param min 最小长度负数自动识别为0
* @return 是否为给定最小长度的英文字母 、数字和下划线
*/
public static boolean isGeneral(CharSequence value, int min) {
@@ -411,9 +446,9 @@ public class Validator {
/**
* 验证是否为给定最小长度的英文字母 、数字和下划线
*
* @param <T> 字符串类型
* @param value 值
* @param min 最小长度负数自动识别为0
* @param <T> 字符串类型
* @param value
* @param min 最小长度负数自动识别为0
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -441,8 +476,8 @@ public class Validator {
/**
* 验证是否全部为字母组成,包括大写和小写字母和汉字
*
* @param <T> 字符串类型
* @param value 表单值
* @param <T> 字符串类型
* @param value 表单值
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -474,8 +509,8 @@ public class Validator {
/**
* 验证字符串是否全部为大写字母
*
* @param <T> 字符串类型
* @param value 表单值
* @param <T> 字符串类型
* @param value 表单值
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -507,8 +542,8 @@ public class Validator {
/**
* 验证字符串是否全部为小写字母
*
* @param <T> 字符串类型
* @param value 表单值
* @param <T> 字符串类型
* @param value 表单值
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -534,7 +569,7 @@ public class Validator {
/**
* 验证是否为数字
*
* @param value 表单值
* @param value 表单值
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -560,8 +595,8 @@ public class Validator {
/**
* 验证是否为字母(包括大写和小写字母)
*
* @param <T> 字符串类型
* @param value 表单值
* @param <T> 字符串类型
* @param value 表单值
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -587,8 +622,8 @@ public class Validator {
/**
* 验证是否为货币
*
* @param <T> 字符串类型
* @param value 值
* @param <T> 字符串类型
* @param value
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -614,8 +649,8 @@ public class Validator {
/**
* 验证是否为邮政编码(中国)
*
* @param <T> 字符串类型
* @param value 表单值
* @param <T> 字符串类型
* @param value 表单值
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -640,8 +675,8 @@ public class Validator {
/**
* 验证是否为可用邮箱地址
*
* @param <T> 字符串类型
* @param value 值
* @param <T> 字符串类型
* @param value
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -666,8 +701,8 @@ public class Validator {
/**
* 验证是否为手机号码(中国)
*
* @param <T> 字符串类型
* @param value 值
* @param <T> 字符串类型
* @param value
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -694,8 +729,8 @@ public class Validator {
* 验证是否为身份证号码18位中国<br>
* 出生日期只支持到到2999年
*
* @param <T> 字符串类型
* @param value 值
* @param <T> 字符串类型
* @param value
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -710,9 +745,9 @@ 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) {
@@ -772,8 +807,8 @@ public class Validator {
/**
* 验证验证是否为生日
*
* @param <T> 字符串类型
* @param value 值
* @param <T> 字符串类型
* @param value
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -798,8 +833,8 @@ public class Validator {
/**
* 验证是否为IPV4地址
*
* @param <T> 字符串类型
* @param value 值
* @param <T> 字符串类型
* @param value
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -824,8 +859,8 @@ public class Validator {
/**
* 验证是否为IPV6地址
*
* @param <T> 字符串类型
* @param value 值
* @param <T> 字符串类型
* @param value
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -851,8 +886,8 @@ public class Validator {
/**
* 验证是否为MAC地址
*
* @param <T> 字符串类型
* @param value 值
* @param <T> 字符串类型
* @param value
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -879,8 +914,8 @@ public class Validator {
/**
* 验证是否为中国车牌号
*
* @param <T> 字符串类型
* @param value 值
* @param <T> 字符串类型
* @param value
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -911,8 +946,8 @@ public class Validator {
/**
* 验证是否为URL
*
* @param <T> 字符串类型
* @param value 值
* @param <T> 字符串类型
* @param value
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -937,8 +972,8 @@ public class Validator {
/**
* 验证是否为汉字
*
* @param <T> 字符串类型
* @param value 表单值
* @param <T> 字符串类型
* @param value 表单值
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -963,8 +998,8 @@ public class Validator {
/**
* 验证是否为中文字、英文字母、数字和下划线
*
* @param <T> 字符串类型
* @param value 值
* @param <T> 字符串类型
* @param value
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -991,8 +1026,8 @@ public class Validator {
* 验证是否为UUID<br>
* 包括带横线标准格式和不带横线的简单模式
*
* @param <T> 字符串类型
* @param value 值
* @param <T> 字符串类型
* @param value
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -1018,8 +1053,8 @@ public class Validator {
/**
* 验证是否为Hex16进制字符串
*
* @param <T> 字符串类型
* @param value 值
* @param <T> 字符串类型
* @param value
* @param errorMsg 验证错误的信息
* @return 验证后的值
* @throws ValidateException 验证异常
@@ -1036,8 +1071,8 @@ public class Validator {
* 检查给定的数字是否在指定范围内
*
* @param value 值
* @param min 最小值(包含)
* @param max 最大值(包含)
* @param min 最小值(包含)
* @param max 最大值(包含)
* @return 是否满足
* @since 4.1.10
*/
@@ -1052,9 +1087,9 @@ 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

@@ -37,6 +37,7 @@ 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();
@@ -167,6 +167,7 @@ public class MapProxy extends OptNullBasicTypeFromObjectGetter<Object> implement
/**
* 将Map代理为指定接口的动态代理对象
*
* @param <T> 代理的Bean类型
* @param interfaceClass 接口
* @return 代理对象
* @since 4.5.2

View File

@@ -22,9 +22,13 @@ import cn.hutool.core.util.StrUtil;
*/
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;
/**
@@ -58,25 +62,26 @@ 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
*
@@ -91,23 +96,23 @@ 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对象
*/
@@ -118,8 +123,8 @@ 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对象
*/
@@ -130,6 +135,8 @@ public class MapUtil {
/**
* 新建TreeMapKey有序的Map
*
* @param <K> key的类型
* @param <V> value的类型
* @param comparator Key比较器
* @return TreeMap
* @since 3.2.3
@@ -141,7 +148,9 @@ 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
@@ -157,6 +166,9 @@ public class MapUtil {
/**
* 创建键不重复Map
*
* @param <K> key的类型
* @param <V> value的类型
* @param size 初始容量
* @return {@link IdentityHashMap}
* @since 4.5.7
*/
@@ -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);
@@ -207,8 +219,8 @@ 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}
*/
@@ -238,10 +251,10 @@ 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}
*/
@@ -264,7 +277,7 @@ public class MapUtil {
* <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
@@ -326,7 +339,7 @@ public class MapUtil {
* {a: 4}
* ]
* </pre>
*
* <p>
* 结果是:
*
* <pre>
@@ -337,8 +350,8 @@ public class MapUtil {
* }
* </pre>
*
* @param <K> 键类型
* @param <V> 值类型
* @param <K> 键类型
* @param <V> 值类型
* @param mapList Map列表
* @return Map
*/
@@ -380,7 +393,7 @@ public class MapUtil {
* c: [1]
* }
* </pre>
*
* <p>
* 结果是:
*
* <pre>
@@ -392,8 +405,8 @@ public class MapUtil {
* ]
* </pre>
*
* @param <K> 键类型
* @param <V> 值类型
* @param <K> 键类型
* @param <V> 值类型
* @param listMap 列表Map
* @return Map列表
*/
@@ -435,6 +448,8 @@ public class MapUtil {
* 将已知Map转换为key为驼峰风格的Map<br>
* 如果KEY为非String类型保留原值
*
* @param <K> key的类型
* @param <V> value的类型
* @param map 原Map
* @return 驼峰风格Map
* @since 3.3.1
@@ -446,7 +461,7 @@ 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
@@ -486,10 +502,10 @@ 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
@@ -501,12 +517,12 @@ 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,6 +543,7 @@ public class MapUtil {
}
// ----------------------------------------------------------------------------------------------- filter
/**
* 过滤<br>
* 过滤过程通过传入的Editor实现来返回需要的元素内容这个Editor实现可以实现以下功能
@@ -536,9 +553,9 @@ public class MapUtil {
* 2、修改元素对象返回集合中为修改后的对象
* </pre>
*
* @param <K> Key类型
* @param <V> Value类型
* @param map Map
* @param <K> Key类型
* @param <V> Value类型
* @param map Map
* @param editor 编辑器接口
* @return 过滤后的Map
*/
@@ -571,9 +588,9 @@ public class MapUtil {
* 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
@@ -600,9 +617,9 @@ 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
@@ -685,10 +702,12 @@ 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);
@@ -697,11 +716,13 @@ 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;
@@ -734,6 +755,8 @@ 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,6 +766,7 @@ public class MapUtil {
}
// ----------------------------------------------------------------------------------------------- builder
/**
* 创建链接调用map
*
@@ -751,7 +775,7 @@ public class MapUtil {
* @return map创建类
*/
public static <K, V> MapBuilder<K, V> builder() {
return builder(new HashMap<K, V>());
return builder(new HashMap<>());
}
/**
@@ -771,8 +795,8 @@ public class MapUtil {
*
* @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) {
@@ -782,9 +806,9 @@ 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
@@ -911,9 +935,9 @@ 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
@@ -925,9 +949,9 @@ 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
@@ -941,7 +965,9 @@ public class MapUtil {
* 实现方式为一处然后重新put当旧的key不存在直接返回<br>
* 当新的key存在抛出{@link IllegalArgumentException} 异常
*
* @param map Map
* @param <K> key的类型
* @param <V> value的类型
* @param map Map
* @param oldKey 原键
* @param newKey 新键
* @return map
@@ -962,6 +988,8 @@ public class MapUtil {
* 去除Map中值为{@code null}的键值对<br>
* 注意此方法在传入的Map上直接修改。
*
* @param <K> key的类型
* @param <V> value的类型
* @param map Map
* @return map
* @since 4.6.5
@@ -973,9 +1001,9 @@ public class MapUtil {
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();
}
}

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

@@ -175,6 +175,7 @@ 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

@@ -13,6 +13,7 @@ import java.nio.charset.Charset;
public class CsvUtil {
//----------------------------------------------------------------------------------------------------------- Reader
/**
* 获取CSV读取器
*
@@ -33,11 +34,13 @@ public class CsvUtil {
}
//----------------------------------------------------------------------------------------------------------- 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);
@@ -46,8 +49,9 @@ public class CsvUtil {
/**
* 获取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);
@@ -57,8 +61,9 @@ public class CsvUtil {
* 获取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);
@@ -67,9 +72,10 @@ public class CsvUtil {
/**
* 获取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);
@@ -78,10 +84,11 @@ public class CsvUtil {
/**
* 获取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);

View File

@@ -9,7 +9,7 @@ import cn.hutool.core.date.TimeInterval;
* ps:
* //模拟1000个线程并发
* ConcurrencyTester ct = new ConcurrencyTester(1000);
* ct.test(() -> {
* ct.test(() -&gt; {
* // 需要并发测试的业务代码
* });
* </pre>
@@ -30,6 +30,7 @@ public class ConcurrencyTester {
* 执行测试
*
* @param runnable 要测试的内容
* @return this
*/
public ConcurrencyTester test(Runnable runnable) {
timeInterval.start();

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

@@ -55,7 +55,7 @@ public class ThreadUtil {
* 获得一个新的线程池<br>
* 如果maximumPoolSize =》 corePoolSize在没有新任务加入的情况下多出的线程将最多保留60s
*
* @param corePoolSize 初始线程池大小
* @param corePoolSize 初始线程池大小
* @param maximumPoolSize 最大线程池大小
* @return {@link ThreadPoolExecutor}
*/
@@ -68,7 +68,7 @@ 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之间的数阻塞因子越大线程池中的线程数越多。
@@ -118,7 +118,7 @@ public class ThreadUtil {
* 执行有返回值的异步方法<br>
* Future代表一个异步执行的操作通过get()方法可以获得操作的结果如果异步操作还没有完成get()会使当前线程阻塞
*
* @param <T> 回调对象类型
* @param <T> 回调对象类型
* @param task {@link Callable}
* @return Future
*/
@@ -153,7 +153,7 @@ public class ThreadUtil {
* 新建一个CompletionService调用其submit方法可以异步执行多个任务最后调用take方法按照完成的顺序获得其结果。<br>
* 若未完成,则会阻塞
*
* @param <T> 回调对象类型
* @param <T> 回调对象类型
* @param executor 执行器 {@link ExecutorService}
* @return CompletionService
*/
@@ -175,7 +175,7 @@ public class ThreadUtil {
* 创建新线程,非守护线程,正常优先级,线程组与当前线程的线程组一致
*
* @param runnable {@link Runnable}
* @param name 线程名
* @param name 线程名
* @return {@link Thread}
* @since 3.1.2
*/
@@ -191,7 +191,7 @@ public class ThreadUtil {
* 创建新线程
*
* @param runnable {@link Runnable}
* @param name 线程名
* @param name 线程名
* @param isDaemon 是否守护线程
* @return {@link Thread}
* @since 4.1.2
@@ -205,7 +205,7 @@ public class ThreadUtil {
/**
* 挂起当前线程
*
* @param timeout 挂起的时长
* @param timeout 挂起的时长
* @param timeUnit 时长单位
* @return 被中断返回false否则true
*/
@@ -240,9 +240,9 @@ 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();
@@ -282,7 +282,7 @@ public class ThreadUtil {
/**
* 创建本地线程对象
*
* @param <T> 持有对象类型
* @param <T> 持有对象类型
* @param isInheritable 是否为子线程提供从父线程那里继承的值
* @return 本地线程
*/
@@ -326,7 +326,7 @@ public class ThreadUtil {
* @param thread 线程
*/
public static void waitForDie(Thread thread) {
if(null == thread){
if (null == thread) {
return;
}
@@ -395,8 +395,9 @@ public class ThreadUtil {
/**
* 创建线程工厂
*
* @param prefix 线程名前缀
* @param prefix 线程名前缀
* @param isDaemon 是否守护线程
* @return {@link ThreadFactory}
* @since 4.0.0
*/
public static ThreadFactory newNamedThreadFactory(String prefix, boolean isDaemon) {
@@ -406,9 +407,10 @@ 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) {
@@ -418,10 +420,11 @@ 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) {
@@ -451,7 +454,7 @@ public class ThreadUtil {
* 结束后可调用{@link ConcurrencyTester#getInterval()} 方法获取执行时间
*
* @param threadSize 并发线程数
* @param runnable 执行的逻辑实现
* @param runnable 执行的逻辑实现
* @return {@link ConcurrencyTester}
* @since 4.5.8
*/

View File

@@ -829,6 +829,7 @@ public class ArrayUtil {
/**
* 去除{@code null} 元素
*
* @param <T> 数组元素类型
* @param array 数组
* @return 处理后的数组
* @since 3.2.2
@@ -846,6 +847,7 @@ public class ArrayUtil {
/**
* 去除{@code null}或者"" 元素
*
* @param <T> 数组元素类型
* @param array 数组
* @return 处理后的数组
* @since 3.2.2
@@ -862,6 +864,7 @@ public class ArrayUtil {
/**
* 去除{@code null}或者""或者空白字符串 元素
*
* @param <T> 数组元素类型
* @param array 数组
* @return 处理后的数组
* @since 3.2.2
@@ -1901,6 +1904,7 @@ public class ArrayUtil {
/**
* 获取子数组
*
* @param <T> 数组元素类型
* @param array 数组
* @param start 开始位置(包括)
* @param end 结束位置(不包括)
@@ -3886,6 +3890,7 @@ 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,28 +67,28 @@ 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;
}
@@ -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

@@ -467,6 +467,7 @@ public class RandomUtil {
/**
* 带有权重的随机生成器
*
* @param <T> 随机对象类型
* @param weightObjs 带有权重的对象列表
* @return {@link WeightRandom}
* @since 4.0.3
@@ -478,6 +479,7 @@ 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

@@ -50,16 +50,20 @@ import cn.hutool.core.lang.Assert;
* 工具类封装了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文件
*
@@ -165,7 +169,7 @@ public class XmlUtil {
/**
* 从XML中读取对象 Reads serialized object from the XML file.
*
* @param <T> 对象类型
* @param <T> 对象类型
* @param source XML文件
* @return 对象
*/
@@ -176,7 +180,7 @@ public class XmlUtil {
/**
* 从XML中读取对象 Reads serialized object from the XML file.
*
* @param <T> 对象类型
* @param <T> 对象类型
* @param xmlStr XML内容
* @return 对象
* @since 3.2.0
@@ -188,7 +192,7 @@ 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,6 +211,7 @@ public class XmlUtil {
}
// -------------------------------------------------------------------------------------- Write
/**
* 将XML文档转换为String<br>
* 字符编码使用XML文档中的编码获取不到则使用UTF-8<br>
@@ -223,7 +228,7 @@ public class XmlUtil {
* 将XML文档转换为String<br>
* 字符编码使用XML文档中的编码获取不到则使用UTF-8
*
* @param doc XML文档
* @param doc XML文档
* @param isPretty 是否格式化输出
* @return XML字符串
* @since 3.0.9
@@ -236,8 +241,8 @@ 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
@@ -278,7 +283,7 @@ public class XmlUtil {
* 将XML文档写入到文件<br>
* 使用Document中的编码
*
* @param doc XML文档
* @param doc XML文档
* @param absolutePath 文件绝对路径,不存在会自动创建
*/
public static void toFile(Document doc, String absolutePath) {
@@ -288,8 +293,8 @@ 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) {
@@ -312,10 +317,10 @@ 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) {
@@ -325,10 +330,10 @@ 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) {
@@ -339,10 +344,10 @@ 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,6 +368,7 @@ public class XmlUtil {
}
// -------------------------------------------------------------------------------------- Create
/**
* 创建XML文档<br>
* 创建的XML默认是utf8编码修改编码的过程是在toStr和toFile方法里即XML在转为文本的时候才定义编码
@@ -407,6 +413,7 @@ public class XmlUtil {
}
// -------------------------------------------------------------------------------------- Function
/**
* 获得XML文档根节点
*
@@ -481,8 +488,8 @@ public class XmlUtil {
/**
* 根据节点名获得第一个子节点
*
* @param element 节点
* @param tagName 节点名
* @param element 节点
* @param tagName 节点名
* @param defaultValue 默认值
* @return 节点中的值
*/
@@ -506,7 +513,7 @@ public class XmlUtil {
* 非Element节点将被忽略
*
* @param parentEle 父节点如果指定将返回此节点的所有直接子节点null返回所有就节点
* @param nodeList NodeList
* @param nodeList NodeList
* @return Element列表
*/
public static List<Element> transElements(Element parentEle, NodeList nodeList) {
@@ -561,7 +568,7 @@ public class XmlUtil {
* 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
*/
@@ -574,7 +581,7 @@ public class XmlUtil {
* 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
*/
@@ -587,7 +594,7 @@ public class XmlUtil {
* 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
*/
@@ -600,7 +607,7 @@ public class XmlUtil {
* 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
@@ -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
*/
@@ -765,7 +774,7 @@ 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) {

View File

@@ -51,8 +51,9 @@ public class BCUtil {
* 解码恢复EC压缩公钥,支持Base64和Hex编码,基于BouncyCastle<br>
* 见https://www.cnblogs.com/xinzhao/p/8963724.html
*
* @param encode 压缩公钥
* @param encode 压缩公钥
* @param curveName EC曲线名
* @return 公钥
* @since 4.4.4
*/
public static PublicKey decodeECPoint(String encode, String curveName) {
@@ -64,7 +65,8 @@ public class BCUtil {
* 见https://www.cnblogs.com/xinzhao/p/8963724.html
*
* @param encodeByte 压缩公钥
* @param curveName EC曲线名例如{@link KeyUtil#SM2_DEFAULT_CURVE}
* @param curveName EC曲线名例如{@link KeyUtil#SM2_DEFAULT_CURVE}
* @return 公钥
* @since 4.4.4
*/
public static PublicKey decodeECPoint(byte[] encodeByte, String curveName) {
@@ -108,7 +110,7 @@ public class BCUtil {
*/
public static PublicKey readPublicKey(InputStream pemStream) {
final Certificate certificate = KeyUtil.readX509Certificate(pemStream);
if(null == certificate) {
if (null == certificate) {
return null;
}
return certificate.getPublicKey();

View File

@@ -588,6 +588,7 @@ public class KeyUtil {
/**
* 获取主体算法名例如RSA/ECB/PKCS1Padding的主体算法是RSA
*
* @param algorithm XXXwithXXX算法
* @return 主体算法名
* @since 4.5.2
*/
@@ -823,6 +824,7 @@ public class KeyUtil {
*
* @param encode 压缩公钥
* @param curveName EC曲线名
* @return 公钥
* @since 4.4.4
*/
public static PublicKey decodeECPoint(String encode, String curveName) {
@@ -835,6 +837,7 @@ public class KeyUtil {
*
* @param encodeByte 压缩公钥
* @param curveName EC曲线名
* @return 公钥
* @since 4.4.4
*/
public static PublicKey decodeECPoint(byte[] encodeByte, String curveName) {

View File

@@ -50,7 +50,6 @@ import cn.hutool.crypto.symmetric.SymmetricCrypto;
* 3、摘要加密digest例如MD5、SHA-1、SHA-256、HMAC等<br>
*
* @author xiaoleilu, Gsealy
*
*/
public final class SecureUtil {
@@ -79,7 +78,7 @@ public final class SecureUtil {
* 生成 {@link SecretKey},仅用于对称加密和摘要算法密钥生成
*
* @param algorithm 算法支持PBE算法
* @param keySize 密钥长度
* @param keySize 密钥长度
* @return {@link SecretKey}
* @since 3.1.2
*/
@@ -91,7 +90,7 @@ public final class SecureUtil {
* 生成 {@link SecretKey},仅用于对称加密和摘要算法密钥生成
*
* @param algorithm 算法
* @param key 密钥,如果为{@code null} 自动生成随机密钥
* @param key 密钥,如果为{@code null} 自动生成随机密钥
* @return {@link SecretKey}
*/
public static SecretKey generateKey(String algorithm, byte[] key) {
@@ -102,7 +101,7 @@ public final class SecureUtil {
* 生成 {@link SecretKey}
*
* @param algorithm DES算法包括DES、DESede等
* @param key 密钥
* @param key 密钥
* @return {@link SecretKey}
*/
public static SecretKey generateDESKey(String algorithm, byte[] key) {
@@ -113,7 +112,7 @@ public final class SecureUtil {
* 生成PBE {@link SecretKey}
*
* @param algorithm PBE算法包括PBEWithMD5AndDES、PBEWithSHA1AndDESede、PBEWithSHA1AndRC2_40等
* @param key 密钥
* @param key 密钥
* @return {@link SecretKey}
*/
public static SecretKey generatePBEKey(String algorithm, char[] key) {
@@ -124,7 +123,7 @@ public final class SecureUtil {
* 生成 {@link SecretKey},仅用于对称加密和摘要算法
*
* @param algorithm 算法
* @param keySpec {@link KeySpec}
* @param keySpec {@link KeySpec}
* @return {@link SecretKey}
*/
public static SecretKey generateKey(String algorithm, KeySpec keySpec) {
@@ -136,7 +135,7 @@ public final class SecureUtil {
* 算法见https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyFactory
*
* @param algorithm 算法
* @param key 密钥
* @param key 密钥
* @return 私钥 {@link PrivateKey}
*/
public static PrivateKey generatePrivateKey(String algorithm, byte[] key) {
@@ -148,7 +147,7 @@ public final class SecureUtil {
* 算法见https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyFactory
*
* @param algorithm 算法
* @param keySpec {@link KeySpec}
* @param keySpec {@link KeySpec}
* @return 私钥 {@link PrivateKey}
* @since 3.1.1
*/
@@ -160,7 +159,7 @@ public final class SecureUtil {
* 生成私钥,仅用于非对称加密
*
* @param keyStore {@link KeyStore}
* @param alias 别名
* @param alias 别名
* @param password 密码
* @return 私钥 {@link PrivateKey}
*/
@@ -173,7 +172,7 @@ public final class SecureUtil {
* 算法见https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyFactory
*
* @param algorithm 算法
* @param key 密钥
* @param key 密钥
* @return 公钥 {@link PublicKey}
*/
public static PublicKey generatePublicKey(String algorithm, byte[] key) {
@@ -185,7 +184,7 @@ public final class SecureUtil {
* 算法见https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyFactory
*
* @param algorithm 算法
* @param keySpec {@link KeySpec}
* @param keySpec {@link KeySpec}
* @return 公钥 {@link PublicKey}
* @since 3.1.1
*/
@@ -209,7 +208,7 @@ public final class SecureUtil {
* 密钥对生成算法见https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyPairGenerator
*
* @param algorithm 非对称加密算法
* @param keySize 密钥模modulus )长度
* @param keySize 密钥模modulus )长度
* @return {@link KeyPair}
*/
public static KeyPair generateKeyPair(String algorithm, int keySize) {
@@ -221,8 +220,8 @@ public final class SecureUtil {
* 密钥对生成算法见https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyPairGenerator
*
* @param algorithm 非对称加密算法
* @param keySize 密钥模modulus )长度
* @param seed 种子
* @param keySize 密钥模modulus )长度
* @param seed 种子
* @return {@link KeyPair}
*/
public static KeyPair generateKeyPair(String algorithm, int keySize, byte[] seed) {
@@ -234,7 +233,7 @@ public final class SecureUtil {
* 密钥对生成算法见https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyPairGenerator
*
* @param algorithm 非对称加密算法
* @param params {@link AlgorithmParameterSpec}
* @param params {@link AlgorithmParameterSpec}
* @return {@link KeyPair}
* @since 4.3.3
*/
@@ -247,8 +246,8 @@ public final class SecureUtil {
* 密钥对生成算法见https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyPairGenerator
*
* @param algorithm 非对称加密算法
* @param seed 种子
* @param params {@link AlgorithmParameterSpec}
* @param seed 种子
* @param params {@link AlgorithmParameterSpec}
* @return {@link KeyPair}
* @since 4.3.3
*/
@@ -271,7 +270,7 @@ public final class SecureUtil {
* 生成算法格式为XXXwithXXX
*
* @param asymmetricAlgorithm 非对称算法
* @param digestAlgorithm 摘要算法
* @param digestAlgorithm 摘要算法
* @return 算法
* @since 4.4.1
*/
@@ -284,7 +283,7 @@ public final class SecureUtil {
* 生成签名对象,仅用于非对称加密
*
* @param asymmetricAlgorithm {@link AsymmetricAlgorithm} 非对称加密算法
* @param digestAlgorithm {@link DigestAlgorithm} 摘要算法
* @param digestAlgorithm {@link DigestAlgorithm} 摘要算法
* @return {@link Signature}
*/
public static Signature generateSignature(AsymmetricAlgorithm asymmetricAlgorithm, DigestAlgorithm digestAlgorithm) {
@@ -300,7 +299,7 @@ public final class SecureUtil {
* KeyStore文件用于数字证书的密钥对保存<br>
* see: http://snowolf.iteye.com/blog/391931
*
* @param in {@link InputStream} 如果想从文件读取.keystore文件使用 {@link FileUtil#getInputStream(java.io.File)} 读取
* @param in {@link InputStream} 如果想从文件读取.keystore文件使用 {@link FileUtil#getInputStream(java.io.File)} 读取
* @param password 密码
* @return {@link KeyStore}
*/
@@ -313,8 +312,8 @@ public final class SecureUtil {
* KeyStore文件用于数字证书的密钥对保存<br>
* see: http://snowolf.iteye.com/blog/391931
*
* @param type 类型
* @param in {@link InputStream} 如果想从文件读取.keystore文件使用 {@link FileUtil#getInputStream(java.io.File)} 读取
* @param type 类型
* @param in {@link InputStream} 如果想从文件读取.keystore文件使用 {@link FileUtil#getInputStream(java.io.File)} 读取
* @param password 密码
* @return {@link KeyStore}
*/
@@ -327,9 +326,9 @@ public final class SecureUtil {
* Certification为证书文件<br>
* see: http://snowolf.iteye.com/blog/391931
*
* @param in {@link InputStream} 如果想从文件读取.cer文件使用 {@link FileUtil#getInputStream(java.io.File)} 读取
* @param in {@link InputStream} 如果想从文件读取.cer文件使用 {@link FileUtil#getInputStream(java.io.File)} 读取
* @param password 密码
* @param alias 别名
* @param alias 别名
* @return {@link KeyStore}
* @since 4.4.1
*/
@@ -355,10 +354,10 @@ public final class SecureUtil {
* Certification为证书文件<br>
* see: http://snowolf.iteye.com/blog/391931
*
* @param type 类型例如X.509
* @param in {@link InputStream} 如果想从文件读取.cer文件使用 {@link FileUtil#getInputStream(java.io.File)} 读取
* @param type 类型例如X.509
* @param in {@link InputStream} 如果想从文件读取.cer文件使用 {@link FileUtil#getInputStream(java.io.File)} 读取
* @param password 密码
* @param alias 别名
* @param alias 别名
* @return {@link KeyStore}
* @since 4.4.1
*/
@@ -372,7 +371,7 @@ public final class SecureUtil {
* see: http://snowolf.iteye.com/blog/391931
*
* @param type 类型例如X.509
* @param in {@link InputStream} 如果想从文件读取.cer文件使用 {@link FileUtil#getInputStream(java.io.File)} 读取
* @param in {@link InputStream} 如果想从文件读取.cer文件使用 {@link FileUtil#getInputStream(java.io.File)} 读取
* @return {@link Certificate}
*/
public static Certificate readCertificate(String type, InputStream in) {
@@ -383,7 +382,7 @@ public final class SecureUtil {
* 获得 Certification
*
* @param keyStore {@link KeyStore}
* @param alias 别名
* @param alias 别名
* @return {@link Certificate}
*/
public static Certificate getCertificate(KeyStore keyStore, String alias) {
@@ -490,6 +489,7 @@ public final class SecureUtil {
}
// ------------------------------------------------------------------- 摘要算法
/**
* MD5加密<br>
* 例:
@@ -627,7 +627,7 @@ public final class SecureUtil {
* 创建HMac对象调用digest方法可获得hmac值
*
* @param algorithm {@link HmacAlgorithm}
* @param key 密钥,如果为<code>null</code>生成随机密钥
* @param key 密钥,如果为<code>null</code>生成随机密钥
* @return {@link HMac}
* @since 3.3.0
*/
@@ -639,7 +639,7 @@ public final class SecureUtil {
* 创建HMac对象调用digest方法可获得hmac值
*
* @param algorithm {@link HmacAlgorithm}
* @param key 密钥,如果为<code>null</code>生成随机密钥
* @param key 密钥,如果为<code>null</code>生成随机密钥
* @return {@link HMac}
* @since 3.0.3
*/
@@ -651,7 +651,7 @@ public final class SecureUtil {
* 创建HMac对象调用digest方法可获得hmac值
*
* @param algorithm {@link HmacAlgorithm}
* @param key 密钥{@link SecretKey},如果为<code>null</code>生成随机密钥
* @param key 密钥{@link SecretKey},如果为<code>null</code>生成随机密钥
* @return {@link HMac}
* @since 3.0.3
*/
@@ -756,7 +756,7 @@ public final class SecureUtil {
* 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
*
* @param privateKeyBase64 私钥Base64
* @param publicKeyBase64 公钥Base64
* @param publicKeyBase64 公钥Base64
* @return {@link RSA}
* @since 3.0.5
*/
@@ -770,7 +770,7 @@ public final class SecureUtil {
* 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
*
* @param privateKey 私钥
* @param publicKey 公钥
* @param publicKey 公钥
* @return {@link RSA}
* @since 3.0.5
*/
@@ -795,9 +795,9 @@ public final class SecureUtil {
* 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
* 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做签名或验证
*
* @param algorithm 签名算法
* @param algorithm 签名算法
* @param privateKeyBase64 私钥Base64
* @param publicKeyBase64 公钥Base64
* @param publicKeyBase64 公钥Base64
* @return {@link Sign}
* @since 3.3.0
*/
@@ -810,8 +810,9 @@ public final class SecureUtil {
* 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
* 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做签名或验证
*
* @param algorithm 算法枚举
* @param privateKey 私钥
* @param publicKey 公钥
* @param publicKey 公钥
* @return {@link Sign}
* @since 3.3.0
*/
@@ -837,11 +838,11 @@ public final class SecureUtil {
* 对参数做签名<br>
* 参数签名为对Map参数按照key的顺序排序后拼接为字符串然后根据提供的签名算法生成签名字符串
*
* @param crypto 对称加密算法
* @param params 参数
* @param separator entry之间的连接符
* @param crypto 对称加密算法
* @param params 参数
* @param separator entry之间的连接符
* @param keyValueSeparator kv之间的连接符
* @param isIgnoreNull 是否忽略null的键和值
* @param isIgnoreNull 是否忽略null的键和值
* @return 签名
* @since 4.0.1
*/
@@ -898,7 +899,7 @@ public final class SecureUtil {
* 拼接后的字符串键值对之间无符号键值对之间无符号忽略null值
*
* @param digestAlgorithm 摘要算法
* @param params 参数
* @param params 参数
* @return 签名
* @since 4.0.1
*/
@@ -910,11 +911,11 @@ public final class SecureUtil {
* 对参数做签名<br>
* 参数签名为对Map参数按照key的顺序排序后拼接为字符串然后根据提供的签名算法生成签名字符串
*
* @param digestAlgorithm 摘要算法
* @param params 参数
* @param separator entry之间的连接符
* @param digestAlgorithm 摘要算法
* @param params 参数
* @param separator entry之间的连接符
* @param keyValueSeparator kv之间的连接符
* @param isIgnoreNull 是否忽略null的键和值
* @param isIgnoreNull 是否忽略null的键和值
* @return 签名
* @since 4.0.1
*/
@@ -927,6 +928,7 @@ public final class SecureUtil {
}
// ------------------------------------------------------------------- UUID
/**
* 简化的UUID去掉了横线
*
@@ -972,6 +974,7 @@ public final class SecureUtil {
* 创建{@link Cipher}
*
* @param algorithm 算法
* @return {@link Cipher}
* @since 4.5.2
*/
public static Cipher createCipher(String algorithm) {
@@ -991,6 +994,7 @@ public final class SecureUtil {
* 创建{@link MessageDigest}
*
* @param algorithm 算法
* @return {@link MessageDigest}
* @since 4.5.2
*/
public static MessageDigest createMessageDigest(String algorithm) {
@@ -1010,6 +1014,7 @@ public final class SecureUtil {
* 创建{@link Mac}
*
* @param algorithm 算法
* @return {@link Mac}
* @since 4.5.13
*/
public static Mac createMac(String algorithm) {

View File

@@ -150,6 +150,7 @@ public abstract class AbstractAsymmetricCrypto<T extends AbstractAsymmetricCrypt
* 编码为Base64字符串
*
* @param data 被加密的字符串
* @param charset 编码
* @param keyType 私钥或公钥 {@link KeyType}
* @return Base64字符串
* @since 4.0.1

View File

@@ -12,7 +12,7 @@ import cn.hutool.core.util.CharsetUtil;
* 使用方法如下:
* <p>
* <code>
* String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt()); <br />
* String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt());
* </code>
* <p>
* 使用checkpw方法检查被加密的字符串是否与原始字符串匹配
@@ -24,8 +24,8 @@ import cn.hutool.core.util.CharsetUtil;
* gensalt方法提供了可选参数 (log_rounds) 来定义加盐多少,也决定了加密的复杂度:
* <p>
* <code>
* String strong_salt = BCrypt.gensalt(10)<br />
* String stronger_salt = BCrypt.gensalt(12)<br />
* String strong_salt = BCrypt.gensalt(10);
* String stronger_salt = BCrypt.gensalt(12);
* </code>
*
* @author Damien Miller
@@ -192,7 +192,7 @@ public class BCrypt {
* @throws IllegalArgumentException if maxolen is invalid
*/
private static byte[] decodeBase64(String s, int maxolen) throws IllegalArgumentException {
StringBuffer rs = new StringBuffer();
final StringBuilder rs = new StringBuilder();
int off = 0, slen = s.length(), olen = 0;
byte[] ret;
byte c1, c2, c3, c4, o;

View File

@@ -12,11 +12,11 @@ import cn.hutool.core.util.CharsetUtil;
* 摘要算法工具类
*
* @author Looly
*
*/
public class DigestUtil {
// ------------------------------------------------------------------------------------------- MD5
/**
* 计算32位MD5摘要值
*
@@ -30,7 +30,7 @@ public class DigestUtil {
/**
* 计算32位MD5摘要值
*
* @param data 被摘要数据
* @param data 被摘要数据
* @param charset 编码
* @return MD5摘要
*/
@@ -81,7 +81,7 @@ public class DigestUtil {
/**
* 计算32位MD5摘要值并转为16进制字符串
*
* @param data 被摘要数据
* @param data 被摘要数据
* @param charset 编码
* @return MD5摘要的16进制表示
*/
@@ -92,7 +92,7 @@ public class DigestUtil {
/**
* 计算32位MD5摘要值并转为16进制字符串
*
* @param data 被摘要数据
* @param data 被摘要数据
* @param charset 编码
* @return MD5摘要的16进制表示
* @since 4.6.0
@@ -132,6 +132,7 @@ public class DigestUtil {
}
// ------------------------------------------------------------------------------------------- MD5 16
/**
* 计算16位MD5摘要值并转为16进制字符串
*
@@ -146,7 +147,7 @@ public class DigestUtil {
/**
* 计算16位MD5摘要值并转为16进制字符串
*
* @param data 被摘要数据
* @param data 被摘要数据
* @param charset 编码
* @return MD5摘要的16进制表示
* @since 4.6.0
@@ -200,6 +201,7 @@ public class DigestUtil {
}
// ------------------------------------------------------------------------------------------- SHA-1
/**
* 计算SHA-1摘要值
*
@@ -213,7 +215,7 @@ public class DigestUtil {
/**
* 计算SHA-1摘要值
*
* @param data 被摘要数据
* @param data 被摘要数据
* @param charset 编码
* @return SHA-1摘要
*/
@@ -264,7 +266,7 @@ public class DigestUtil {
/**
* 计算SHA-1摘要值并转为16进制字符串
*
* @param data 被摘要数据
* @param data 被摘要数据
* @param charset 编码
* @return SHA-1摘要的16进制表示
*/
@@ -303,6 +305,7 @@ public class DigestUtil {
}
// ------------------------------------------------------------------------------------------- SHA-256
/**
* 计算SHA-256摘要值
*
@@ -317,7 +320,7 @@ public class DigestUtil {
/**
* 计算SHA-256摘要值
*
* @param data 被摘要数据
* @param data 被摘要数据
* @param charset 编码
* @return SHA-256摘要
* @since 3.0.8
@@ -373,7 +376,7 @@ public class DigestUtil {
/**
* 计算SHA-256摘要值并转为16进制字符串
*
* @param data 被摘要数据
* @param data 被摘要数据
* @param charset 编码
* @return SHA-256摘要的16进制表示
* @since 3.0.8
@@ -416,11 +419,12 @@ public class DigestUtil {
}
// ------------------------------------------------------------------------------------------- Hmac
/**
* 创建HMac对象调用digest方法可获得hmac值
*
* @param algorithm {@link HmacAlgorithm}
* @param key 密钥,如果为<code>null</code>生成随机密钥
* @param key 密钥,如果为<code>null</code>生成随机密钥
* @return {@link HMac}
* @since 3.0.3
*/
@@ -432,7 +436,7 @@ public class DigestUtil {
* 创建HMac对象调用digest方法可获得hmac值
*
* @param algorithm {@link HmacAlgorithm}
* @param key 密钥{@link SecretKey},如果为<code>null</code>生成随机密钥
* @param key 密钥{@link SecretKey},如果为<code>null</code>生成随机密钥
* @return {@link HMac}
* @since 3.0.3
*/
@@ -477,6 +481,7 @@ public class DigestUtil {
* 验证密码是否与Bcrypt加密后的密文匹配
*
* @param password 明文密码
* @param hashed hash值加密后的值
* @return 是否匹配
* @since 4.1.1
*/

View File

@@ -29,21 +29,23 @@ import cn.hutool.db.sql.Wrapper;
* 提供抽象方法getConnection和closeConnection用于自定义数据库连接的打开和关闭
*
* @author Luxiaolei
*
*/
public abstract class AbstractDb implements Serializable{
public abstract class AbstractDb implements Serializable {
private static final long serialVersionUID = 3858951941916349062L;
protected DataSource ds;
/** 是否支持事务 */
/**
* 是否支持事务
*/
protected Boolean isSupportTransaction = null;
protected SqlConnRunner runner;
// ------------------------------------------------------- Constructor start
/**
* 构造
*
* @param ds 数据源
* @param ds 数据源
* @param dialect 数据库方言
*/
public AbstractDb(DataSource ds, Dialect dialect) {
@@ -71,7 +73,7 @@ public abstract class AbstractDb implements Serializable{
/**
* 查询
*
* @param sql 查询语句
* @param sql 查询语句
* @param params 参数
* @return 结果对象
* @throws SQLException SQL执行异常
@@ -84,11 +86,10 @@ public abstract class AbstractDb implements Serializable{
/**
* 查询
*
* @param <T> 结果集需要处理的对象类型
*
* @param sql 查询语句
* @param <T> 结果集需要处理的对象类型
* @param sql 查询语句
* @param beanClass 元素Bean类型
* @param params 参数
* @param params 参数
* @return 结果对象
* @throws SQLException SQL执行异常
* @since 3.2.2
@@ -100,7 +101,7 @@ public abstract class AbstractDb implements Serializable{
/**
* 查询单条记录
*
* @param sql 查询语句
* @param sql 查询语句
* @param params 参数
* @return 结果对象
* @throws SQLException SQL执行异常
@@ -112,7 +113,7 @@ public abstract class AbstractDb implements Serializable{
/**
* 查询单条单个字段记录,并将其转换为Number
*
* @param sql 查询语句
* @param sql 查询语句
* @param params 参数
* @return 结果对象
* @throws SQLException SQL执行异常
@@ -124,7 +125,7 @@ public abstract class AbstractDb implements Serializable{
/**
* 查询单条单个字段记录,并将其转换为String
*
* @param sql 查询语句
* @param sql 查询语句
* @param params 参数
* @return 结果对象
* @throws SQLException SQL执行异常
@@ -136,9 +137,9 @@ public abstract class AbstractDb implements Serializable{
/**
* 查询
*
* @param <T> 结果集需要处理的对象类型
* @param sql 查询语句
* @param rsh 结果集处理对象
* @param <T> 结果集需要处理的对象类型
* @param sql 查询语句
* @param rsh 结果集处理对象
* @param params 参数
* @return 结果对象
* @throws SQLException SQL执行异常
@@ -157,7 +158,7 @@ public abstract class AbstractDb implements Serializable{
* 执行非查询语句<br>
* 语句包括 插入、更新、删除
*
* @param sql SQL
* @param sql SQL
* @param params 参数
* @return 影响行数
* @throws SQLException SQL执行异常
@@ -176,7 +177,7 @@ public abstract class AbstractDb implements Serializable{
* 执行非查询语句<br>
* 语句包括 插入、更新、删除
*
* @param sql SQL
* @param sql SQL
* @param params 参数
* @return 主键
* @throws SQLException SQL执行异常
@@ -194,7 +195,7 @@ public abstract class AbstractDb implements Serializable{
/**
* 批量执行非查询语句
*
* @param sql SQL
* @param sql SQL
* @param paramsBatch 批量的参数
* @return 每个SQL执行影响的行数
* @throws SQLException SQL执行异常
@@ -228,6 +229,7 @@ public abstract class AbstractDb implements Serializable{
}
// ---------------------------------------------------------------------------- CRUD start
/**
* 插入数据
*
@@ -250,7 +252,7 @@ public abstract class AbstractDb implements Serializable{
* 根据给定的字段名查询数据,如果存在则更新这些数据,否则执行插入
*
* @param record 记录
* @param keys 需要检查唯一性的字段
* @param keys 需要检查唯一性的字段
* @return 插入行数
* @throws SQLException SQL执行异常
* @since 4.0.10
@@ -322,8 +324,8 @@ public abstract class AbstractDb implements Serializable{
* 删除数据
*
* @param tableName 表名
* @param field 字段名,最好是主键
* @param value 值值可以是列表或数组被当作IN查询处理
* @param field 字段名,最好是主键
* @param value 值可以是列表或数组被当作IN查询处理
* @return 删除行数
* @throws SQLException SQL执行异常
*/
@@ -353,7 +355,7 @@ public abstract class AbstractDb implements Serializable{
* 更新条件为多个key value对表示默认key = value如果使用其它条件可以使用where.put("key", " &gt; 1")value也可以传Condition对象key被忽略
*
* @param record 记录
* @param where 条件
* @param where 条件
* @return 影响行数
* @throws SQLException SQL执行异常
*/
@@ -368,14 +370,15 @@ public abstract class AbstractDb implements Serializable{
}
// ------------------------------------------------------------- Get start
/**
* 根据某个字段(最好是唯一字段)查询单个记录<br>
* 当有多条返回时,只显示查询到的第一条
*
* @param <T> 字段值类型
* @param <T> 字段值类型
* @param tableName 表名
* @param field 字段名
* @param value 字段值
* @param field 字段名
* @param value 字段值
* @return 记录
* @throws SQLException SQL执行异常
*/
@@ -400,10 +403,10 @@ public abstract class AbstractDb implements Serializable{
* 查询<br>
* 查询条件为多个key value对表示默认key = value如果使用其它条件可以使用where.put("key", " &gt; 1")value也可以传Condition对象key被忽略
*
* @param <T> 需要处理成的结果对象类型
* @param <T> 需要处理成的结果对象类型
* @param fields 返回的字段列表null则返回所有字段
* @param where 条件实体类(包含表名)
* @param rsh 结果集处理对象
* @param where 条件实体类(包含表名)
* @param rsh 结果集处理对象
* @return 结果对象
* @throws SQLException SQL执行异常
*/
@@ -422,7 +425,7 @@ public abstract class AbstractDb implements Serializable{
* 查询条件为多个key value对表示默认key = value如果使用其它条件可以使用where.put("key", " &gt; 1")value也可以传Condition对象key被忽略
*
* @param fields 返回的字段列表null则返回所有字段
* @param where 条件实体类(包含表名)
* @param where 条件实体类(包含表名)
* @return 结果Entity列表
* @throws SQLException SQL执行异常
* @since 4.5.16
@@ -435,9 +438,9 @@ public abstract class AbstractDb implements Serializable{
* 查询<br>
* Query为查询所需数据的一个实体类此对象中可以定义返回字段、查询条件查询的表、分页等信息
*
* @param <T> 需要处理成的结果对象类型
* @param <T> 需要处理成的结果对象类型
* @param query {@link Query}对象,此对象中可以定义返回字段、查询条件,查询的表、分页等信息
* @param rsh 结果集处理对象
* @param rsh 结果集处理对象
* @return 结果对象
* @throws SQLException SQL执行异常
* @since 4.0.0
@@ -456,9 +459,9 @@ public abstract class AbstractDb implements Serializable{
* 查询,返回所有字段<br>
* 查询条件为多个key value对表示默认key = value如果使用其它条件可以使用where.put("key", " &gt; 1")value也可以传Condition对象key被忽略
*
* @param <T> 需要处理成的结果对象类型
* @param where 条件实体类(包含表名)
* @param rsh 结果集处理对象
* @param <T> 需要处理成的结果对象类型
* @param where 条件实体类(包含表名)
* @param rsh 结果集处理对象
* @param fields 字段列表,可变长参数如果无值表示查询全部字段
* @return 结果对象
* @throws SQLException SQL执行异常
@@ -484,8 +487,9 @@ public abstract class AbstractDb implements Serializable{
* 查询数据列表返回字段由where参数指定<br>
* 查询条件为多个key value对表示默认key = value如果使用其它条件可以使用where.put("key", " &gt; 1")value也可以传Condition对象key被忽略
*
* @param <T> Bean类型
* @param where 条件实体类(包含表名)
* @param <T> Bean类型
* @param where 条件实体类(包含表名)
* @param beanClass Bean类
* @return 数据对象列表
* @throws SQLException SQL执行异常
* @since 3.2.2
@@ -510,7 +514,7 @@ public abstract class AbstractDb implements Serializable{
* 查询数据列表,返回所有字段<br>
* 查询条件为多个key value对表示默认key = value如果使用其它条件可以使用where.put("key", " &gt; 1")value也可以传Condition对象key被忽略
*
* @param <T> Bean类型
* @param <T> Bean类型
* @param where 条件实体类(包含表名)
* @return 数据对象列表
* @throws SQLException SQL执行异常
@@ -535,8 +539,8 @@ public abstract class AbstractDb implements Serializable{
* 根据某个字段名条件查询数据列表,返回所有字段
*
* @param tableName 表名
* @param field 字段名
* @param value 字段值
* @param field 字段名
* @param value 字段值
* @return 数据对象列表
* @throws SQLException SQL执行异常
*/
@@ -548,7 +552,7 @@ public abstract class AbstractDb implements Serializable{
* 根据多个条件查询数据列表,返回所有字段
*
* @param tableName 表名
* @param wheres 字段名
* @param wheres 字段名
* @return 数据对象列表
* @throws SQLException SQL执行异常
* @since 4.0.0
@@ -562,9 +566,9 @@ public abstract class AbstractDb implements Serializable{
* 根据某个字段名条件查询数据列表,返回所有字段
*
* @param tableName 表名
* @param field 字段名
* @param value 字段值
* @param likeType {@link LikeType}
* @param field 字段名
* @param value 字段值
* @param likeType {@link LikeType}
* @return 数据对象列表
* @throws SQLException SQL执行异常
*/
@@ -593,12 +597,12 @@ public abstract class AbstractDb implements Serializable{
* 分页查询<br>
* 查询条件为多个key value对表示默认key = value如果使用其它条件可以使用where.put("key", " &gt; 1")value也可以传Condition对象key被忽略
*
* @param <T> 结果对象类型
* @param fields 返回的字段列表null则返回所有字段
* @param where 条件实体类(包含表名)
* @param page 页码0表示第一页
* @param <T> 结果对象类型
* @param fields 返回的字段列表null则返回所有字段
* @param where 条件实体类(包含表名)
* @param page 页码0表示第一页
* @param numPerPage 每页条目数
* @param rsh 结果集处理对象
* @param rsh 结果集处理对象
* @return 结果对象
* @throws SQLException SQL执行异常
*/
@@ -616,11 +620,11 @@ public abstract class AbstractDb implements Serializable{
* 分页查询<br>
* 查询条件为多个key value对表示默认key = value如果使用其它条件可以使用where.put("key", " &gt; 1")value也可以传Condition对象key被忽略
*
* @param <T> 结果对象类型
* @param where 条件实体类(包含表名)
* @param page 页码0表示第一页
* @param <T> 结果对象类型
* @param where 条件实体类(包含表名)
* @param page 页码0表示第一页
* @param numPerPage 每页条目数
* @param rsh 结果集处理对象
* @param rsh 结果集处理对象
* @return 结果对象
* @throws SQLException SQL执行异常
* @since 3.2.2
@@ -633,8 +637,8 @@ public abstract class AbstractDb implements Serializable{
* 分页查询结果为Entity列表不计算总数<br>
* 查询条件为多个key value对表示默认key = value如果使用其它条件可以使用where.put("key", " &gt; 1")value也可以传Condition对象key被忽略
*
* @param where 条件实体类(包含表名)
* @param page 页码0表示第一页
* @param where 条件实体类(包含表名)
* @param page 页码0表示第一页
* @param numPerPage 每页条目数
* @return 结果对象
* @throws SQLException SQL执行异常
@@ -649,7 +653,7 @@ public abstract class AbstractDb implements Serializable{
* 查询条件为多个key value对表示默认key = value如果使用其它条件可以使用where.put("key", " &gt; 1")value也可以传Condition对象key被忽略
*
* @param where 条件实体类(包含表名)
* @param page 分页对象
* @param page 分页对象
* @return 结果对象
* @throws SQLException SQL执行异常
* @since 3.2.2
@@ -662,10 +666,10 @@ public abstract class AbstractDb implements Serializable{
* 分页查询<br>
* 查询条件为多个key value对表示默认key = value如果使用其它条件可以使用where.put("key", " &gt; 1")value也可以传Condition对象key被忽略
*
* @param <T> 结果对象类型
* @param <T> 结果对象类型
* @param where 条件实体类(包含表名)
* @param page 分页对象
* @param rsh 结果集处理对象
* @param page 分页对象
* @param rsh 结果集处理对象
* @return 结果对象
* @throws SQLException SQL执行异常
* @since 3.2.2
@@ -678,11 +682,11 @@ public abstract class AbstractDb implements Serializable{
* 分页查询<br>
* 查询条件为多个key value对表示默认key = value如果使用其它条件可以使用where.put("key", " &gt; 1")value也可以传Condition对象key被忽略
*
* @param <T> 结果对象类型
* @param <T> 结果对象类型
* @param fields 返回的字段列表null则返回所有字段
* @param where 条件实体类(包含表名)
* @param page 分页对象
* @param rsh 结果集处理对象
* @param where 条件实体类(包含表名)
* @param page 分页对象
* @param rsh 结果集处理对象
* @return 结果对象
* @throws SQLException SQL执行异常
*/
@@ -700,9 +704,9 @@ public abstract class AbstractDb implements Serializable{
* 分页查询<br>
* 查询条件为多个key value对表示默认key = value如果使用其它条件可以使用where.put("key", " &gt; 1")value也可以传Condition对象key被忽略
*
* @param fields 返回的字段列表null则返回所有字段
* @param where 条件实体类(包含表名)
* @param page 分页对象
* @param fields 返回的字段列表null则返回所有字段
* @param where 条件实体类(包含表名)
* @param page 分页对象
* @param numPerPage 每页条目数
* @return 结果对象
* @throws SQLException SQL执行异常
@@ -722,8 +726,8 @@ public abstract class AbstractDb implements Serializable{
* 查询条件为多个key value对表示默认key = value如果使用其它条件可以使用where.put("key", " &gt; 1")value也可以传Condition对象key被忽略
*
* @param fields 返回的字段列表null则返回所有字段
* @param where 条件实体类(包含表名)
* @param page 分页对象
* @param where 条件实体类(包含表名)
* @param page 分页对象
* @return 结果对象
* @throws SQLException SQL执行异常
*/
@@ -741,8 +745,8 @@ public abstract class AbstractDb implements Serializable{
* 分页查询<br>
* 查询条件为多个key value对表示默认key = value如果使用其它条件可以使用where.put("key", " &gt; 1")value也可以传Condition对象key被忽略
*
* @param where 条件实体类(包含表名)
* @param page 页码
* @param where 条件实体类(包含表名)
* @param page 页码
* @param numPerPage 每页条目数
* @return 分页结果集
* @throws SQLException SQL执行异常
@@ -757,7 +761,7 @@ public abstract class AbstractDb implements Serializable{
* 查询条件为多个key value对表示默认key = value如果使用其它条件可以使用where.put("key", " &gt; 1")value也可以传Condition对象key被忽略
*
* @param where 条件实体类(包含表名)
* @param page 分页对象
* @param page 分页对象
* @return 分页结果集
* @throws SQLException SQL执行异常
*/
@@ -767,6 +771,7 @@ public abstract class AbstractDb implements Serializable{
// ---------------------------------------------------------------------------- CRUD end
// ---------------------------------------------------------------------------- Getters and Setters start
/**
* 获取{@link SqlConnRunner}
*
@@ -821,11 +826,12 @@ public abstract class AbstractDb implements Serializable{
// ---------------------------------------------------------------------------- Getters and Setters end
// ---------------------------------------------------------------------------- protected method start
/**
* 检查数据库是否支持事务此项检查同一个数据源只检查一次如果不支持抛出DbRuntimeException异常
*
* @param conn Connection
* @throws SQLException 获取元数据信息失败
* @throws SQLException 获取元数据信息失败
* @throws DbRuntimeException 不支持事务
*/
protected void checkTransactionSupported(Connection conn) throws SQLException, DbRuntimeException {

View File

@@ -123,8 +123,6 @@ public class Session extends AbstractDb implements Closeable {
public void commit() throws SQLException {
try {
getConnection().commit();
} catch (SQLException e) {
throw e;
} finally {
try {
getConnection().setAutoCommit(true); // 事务结束,恢复自动提交
@@ -142,8 +140,6 @@ public class Session extends AbstractDb implements Closeable {
public void rollback() throws SQLException {
try {
getConnection().rollback();
} catch (SQLException e) {
throw e;
} finally {
try {
getConnection().setAutoCommit(true); // 事务结束,恢复自动提交
@@ -180,8 +176,6 @@ public class Session extends AbstractDb implements Closeable {
public void rollback(Savepoint savepoint) throws SQLException {
try {
getConnection().rollback(savepoint);
} catch (SQLException e) {
throw e;
} finally {
try {
getConnection().setAutoCommit(true); // 事务结束,恢复自动提交
@@ -195,9 +189,8 @@ public class Session extends AbstractDb implements Closeable {
* 静默回滚到某个保存点保存点的设置请使用setSavepoint方法
*
* @param savepoint 保存点
* @throws SQLException SQL执行异常
*/
public void quietRollback(Savepoint savepoint) throws SQLException {
public void quietRollback(Savepoint savepoint) {
try {
getConnection().rollback(savepoint);
} catch (Exception e) {
@@ -255,7 +248,7 @@ public class Session extends AbstractDb implements Closeable {
* 在事务中执行操作,通过实现{@link VoidFunc0}接口的call方法执行多条SQL语句从而完成事务
*
* @param func 函数抽象在函数中执行多个SQL操作多个操作会被合并为同一事务
* @throws SQLException
* @throws SQLException SQL异常
* @since 3.2.3
*/
public void tx(VoidFunc1<Session> func) throws SQLException {

View File

@@ -28,10 +28,10 @@ import java.util.List;
* SQL执行类<br>
* 此执行类只接受方言参数,不需要数据源,只有在执行方法时需要数据库连接对象<br>
* 此对象存在的意义在于,可以由使用者自定义数据库连接对象,并执行多个方法,方便事务的统一控制或减少连接对象的创建关闭
* @author Luxiaolei
*
* @author Luxiaolei
*/
public class SqlConnRunner{
public class SqlConnRunner {
private Dialect dialect;
/**
@@ -65,8 +65,10 @@ public class SqlConnRunner{
}
//------------------------------------------------------- Constructor start
/**
* 构造
*
* @param dialect 方言
*/
public SqlConnRunner(Dialect dialect) {
@@ -75,6 +77,7 @@ public class SqlConnRunner{
/**
* 构造
*
* @param driverClassName 驱动类名,,用于识别方言
*/
public SqlConnRunner(String driverClassName) {
@@ -83,17 +86,19 @@ public class SqlConnRunner{
//------------------------------------------------------- Constructor end
//---------------------------------------------------------------------------- CRUD start
/**
* 插入数据<br>
* 此方法不会关闭Connection
* @param conn 数据库连接
*
* @param conn 数据库连接
* @param record 记录
* @return 插入行数
* @throws SQLException SQL执行异常
*/
public int insert(Connection conn, Entity record) throws SQLException {
checkConn(conn);
if(CollectionUtil.isEmpty(record)){
if (CollectionUtil.isEmpty(record)) {
throw new SQLException("Empty entity provided!");
}
PreparedStatement ps = null;
@@ -109,17 +114,17 @@ public class SqlConnRunner{
* 插入或更新数据<br>
* 此方法不会关闭Connection
*
* @param conn 数据库连接
* @param conn 数据库连接
* @param record 记录
* @param keys 需要检查唯一性的字段
* @param keys 需要检查唯一性的字段
* @return 插入行数
* @throws SQLException SQL执行异常
*/
public int insertOrUpdate(Connection conn, Entity record, String... keys) throws SQLException {
final Entity where = record.filter(keys);
if(MapUtil.isNotEmpty(where) && count(conn, where) > 0) {
if (MapUtil.isNotEmpty(where) && count(conn, where) > 0) {
return update(conn, record, where);
}else {
} else {
return insert(conn, record);
}
}
@@ -130,7 +135,7 @@ public class SqlConnRunner{
* 也就是说假如第一条数据只有2个字段后边数据多于这两个字段的部分将被抛弃。
* 此方法不会关闭Connection
*
* @param conn 数据库连接
* @param conn 数据库连接
* @param records 记录列表记录KV必须严格一致
* @return 插入行数
* @throws SQLException SQL执行异常
@@ -144,20 +149,20 @@ public class SqlConnRunner{
* 批量插入必须严格保持Entity的结构一致不一致会导致插入数据出现不可预知的结果<br>
* 此方法不会关闭Connection
*
* @param conn 数据库连接
* @param conn 数据库连接
* @param records 记录列表记录KV必须严格一致
* @return 插入行数
* @throws SQLException SQL执行异常
*/
public int[] insert(Connection conn, Entity... records) throws SQLException {
checkConn(conn);
if(ArrayUtil.isEmpty(records)){
if (ArrayUtil.isEmpty(records)) {
return new int[]{0};
}
//单条单独处理
if(1 == records.length) {
return new int[] { insert(conn, records[0])};
if (1 == records.length) {
return new int[]{insert(conn, records[0])};
}
PreparedStatement ps = null;
@@ -172,14 +177,15 @@ public class SqlConnRunner{
/**
* 插入数据<br>
* 此方法不会关闭Connection
* @param conn 数据库连接
*
* @param conn 数据库连接
* @param record 记录
* @return 主键列表
* @throws SQLException SQL执行异常
*/
public List<Object> insertForGeneratedKeys(Connection conn, Entity record) throws SQLException {
checkConn(conn);
if(CollectionUtil.isEmpty(record)){
if (CollectionUtil.isEmpty(record)) {
throw new SQLException("Empty entity provided!");
}
@@ -196,14 +202,15 @@ public class SqlConnRunner{
/**
* 插入数据<br>
* 此方法不会关闭Connection
* @param conn 数据库连接
*
* @param conn 数据库连接
* @param record 记录
* @return 自增主键
* @throws SQLException SQL执行异常
*/
public Long insertForGeneratedKey(Connection conn, Entity record) throws SQLException {
checkConn(conn);
if(CollectionUtil.isEmpty(record)){
if (CollectionUtil.isEmpty(record)) {
throw new SQLException("Empty entity provided!");
}
@@ -220,14 +227,15 @@ public class SqlConnRunner{
/**
* 删除数据<br>
* 此方法不会关闭Connection
* @param conn 数据库连接
*
* @param conn 数据库连接
* @param where 条件
* @return 影响行数
* @throws SQLException SQL执行异常
*/
public int del(Connection conn, Entity where) throws SQLException {
checkConn(conn);
if(CollectionUtil.isEmpty(where)){
if (CollectionUtil.isEmpty(where)) {
//不允许做全表删除
throw new SQLException("Empty entity provided!");
}
@@ -245,25 +253,26 @@ public class SqlConnRunner{
/**
* 更新数据<br>
* 此方法不会关闭Connection
* @param conn 数据库连接
*
* @param conn 数据库连接
* @param record 记录
* @param where 条件
* @param where 条件
* @return 影响行数
* @throws SQLException SQL执行异常
*/
public int update(Connection conn, Entity record, Entity where) throws SQLException {
checkConn(conn);
if(CollectionUtil.isEmpty(record)){
if (CollectionUtil.isEmpty(record)) {
throw new SQLException("Empty entity provided!");
}
if(CollectionUtil.isEmpty(where)){
if (CollectionUtil.isEmpty(where)) {
//不允许做全表更新
throw new SQLException("Empty where provided!");
}
//表名可以从被更新记录的Entity中获得也可以从Where中获得
String tableName = record.getTableName();
if(StrUtil.isBlank(tableName)){
if (StrUtil.isBlank(tableName)) {
tableName = where.getTableName();
record.setTableName(tableName);
}
@@ -282,10 +291,10 @@ public class SqlConnRunner{
* 查询<br>
* 此方法不会关闭Connection
*
* @param <T> 结果对象类型
* @param conn 数据库连接对象
* @param <T> 结果对象类型
* @param conn 数据库连接对象
* @param query {@link Query}
* @param rsh 结果集处理对象
* @param rsh 结果集处理对象
* @return 结果对象
* @throws SQLException SQL执行异常
*/
@@ -306,11 +315,11 @@ public class SqlConnRunner{
* 查询<br>
* 此方法不会关闭Connection
*
* @param <T> 结果对象类型
* @param conn 数据库连接对象
* @param <T> 结果对象类型
* @param conn 数据库连接对象
* @param fields 返回的字段列表null则返回所有字段
* @param where 条件实体类(包含表名)
* @param rsh 结果集处理对象
* @param where 条件实体类(包含表名)
* @param rsh 结果集处理对象
* @return 结果对象
* @throws SQLException SQL执行异常
*/
@@ -324,10 +333,10 @@ public class SqlConnRunner{
* 查询,返回指定字段列表<br>
* 此方法不会关闭Connection
*
* @param <T> 结果对象类型
* @param conn 数据库连接对象
* @param where 条件实体类(包含表名)
* @param rsh 结果集处理对象
* @param <T> 结果对象类型
* @param conn 数据库连接对象
* @param where 条件实体类(包含表名)
* @param rsh 结果集处理对象
* @param fields 字段列表,可变长参数如果无值表示查询全部字段
* @return 结果对象
* @throws SQLException SQL执行异常
@@ -339,86 +348,87 @@ public class SqlConnRunner{
/**
* 查询数据列表返回字段在where参数中定义
*
* @param conn 数据库连接对象
* @param conn 数据库连接对象
* @param where 条件实体类(包含表名)
* @return 数据对象列表
* @throws SQLException SQL执行异常
* @since 3.2.1
*/
public List<Entity> find(Connection conn, Entity where) throws SQLException{
public List<Entity> find(Connection conn, Entity where) throws SQLException {
return find(conn, where.getFieldNames(), where, EntityListHandler.create());
}
/**
* 查询数据列表,返回所有字段
*
* @param conn 数据库连接对象
* @param conn 数据库连接对象
* @param where 条件实体类(包含表名)
* @return 数据对象列表
* @throws SQLException SQL执行异常
*/
public List<Entity> findAll(Connection conn, Entity where) throws SQLException{
public List<Entity> findAll(Connection conn, Entity where) throws SQLException {
return find(conn, where, EntityListHandler.create());
}
/**
* 查询数据列表,返回所有字段
*
* @param conn 数据库连接对象
* @param conn 数据库连接对象
* @param tableName 表名
* @return 数据对象列表
* @throws SQLException SQL执行异常
*/
public List<Entity> findAll(Connection conn, String tableName) throws SQLException{
public List<Entity> findAll(Connection conn, String tableName) throws SQLException {
return findAll(conn, Entity.create(tableName));
}
/**
* 根据某个字段名条件查询数据列表,返回所有字段
*
* @param conn 数据库连接对象
* @param conn 数据库连接对象
* @param tableName 表名
* @param field 字段名
* @param value 字段值
* @param field 字段名
* @param value 字段值
* @return 数据对象列表
* @throws SQLException SQL执行异常
*/
public List<Entity> findBy(Connection conn, String tableName, String field, Object value) throws SQLException{
public List<Entity> findBy(Connection conn, String tableName, String field, Object value) throws SQLException {
return findAll(conn, Entity.create(tableName).set(field, value));
}
/**
* 根据某个字段名条件查询数据列表,返回所有字段
*
* @param conn 数据库连接对象
* @param conn 数据库连接对象
* @param tableName 表名
* @param field 字段名
* @param value 字段值
* @param likeType {@link LikeType}
* @param field 字段名
* @param value 字段值
* @param likeType {@link LikeType}
* @return 数据对象列表
* @throws SQLException SQL执行异常
*/
public List<Entity> findLike(Connection conn, String tableName, String field, String value, LikeType likeType) throws SQLException{
public List<Entity> findLike(Connection conn, String tableName, String field, String value, LikeType likeType) throws SQLException {
return findAll(conn, Entity.create(tableName).set(field, SqlUtil.buildLikeValue(value, likeType, true)));
}
/**
* 根据某个字段名条件查询数据列表,返回所有字段
*
* @param conn 数据库连接对象
* @param conn 数据库连接对象
* @param tableName 表名
* @param field 字段名
* @param values 字段值列表
* @param field 字段名
* @param values 字段值列表
* @return 数据对象列表
* @throws SQLException SQL执行异常
*/
public List<Entity> findIn(Connection conn, String tableName, String field, Object... values) throws SQLException{
public List<Entity> findIn(Connection conn, String tableName, String field, Object... values) throws SQLException {
return findAll(conn, Entity.create(tableName).set(field, values));
}
/**
* 结果的条目数
* @param conn 数据库连接对象
*
* @param conn 数据库连接对象
* @param where 查询条件
* @return 复合条件的结果数
* @throws SQLException SQL执行异常
@@ -440,13 +450,13 @@ public class SqlConnRunner{
* 分页查询<br>
* 此方法不会关闭Connection
*
* @param <T> 结果对象类型
* @param conn 数据库连接对象
* @param fields 返回的字段列表null则返回所有字段
* @param where 条件实体类(包含表名)
* @param <T> 结果对象类型
* @param conn 数据库连接对象
* @param fields 返回的字段列表null则返回所有字段
* @param where 条件实体类(包含表名)
* @param pageNumber 页码
* @param numPerPage 每页条目数
* @param rsh 结果集处理对象
* @param rsh 结果集处理对象
* @return 结果对象
* @throws SQLException SQL执行异常
*/
@@ -458,18 +468,18 @@ public class SqlConnRunner{
* 分页查询<br>
* 此方法不会关闭Connection
*
* @param <T> 结果对象类型
* @param conn 数据库连接对象
* @param <T> 结果对象类型
* @param conn 数据库连接对象
* @param fields 返回的字段列表null则返回所有字段
* @param where 条件实体类(包含表名)
* @param page 分页对象
* @param rsh 结果集处理对象
* @param where 条件实体类(包含表名)
* @param page 分页对象
* @param rsh 结果集处理对象
* @return 结果对象
* @throws SQLException SQL执行异常
*/
public <T> T page(Connection conn, Collection<String> fields, Entity where, Page page, RsHandler<T> rsh) throws SQLException {
checkConn(conn);
if(null == page){
if (null == page) {
return this.find(conn, fields, where, rsh);
}
@@ -483,10 +493,10 @@ public class SqlConnRunner{
* 分页查询<br>
* 此方法不会关闭Connection
*
* @param conn 数据库连接对象
* @param fields 返回的字段列表null则返回所有字段
* @param where 条件实体类(包含表名)
* @param page 页码
* @param conn 数据库连接对象
* @param fields 返回的字段列表null则返回所有字段
* @param where 条件实体类(包含表名)
* @param page 页码
* @param numPerPage 每页条目数
* @return 结果对象
* @throws SQLException SQL执行异常
@@ -503,10 +513,10 @@ public class SqlConnRunner{
* 分页查询<br>
* 此方法不会关闭Connection
*
* @param conn 数据库连接对象
* @param conn 数据库连接对象
* @param fields 返回的字段列表null则返回所有字段
* @param where 条件实体类(包含表名)
* @param page 分页对象
* @param where 条件实体类(包含表名)
* @param page 分页对象
* @return 结果对象
* @throws SQLException SQL执行异常
*/
@@ -514,7 +524,7 @@ public class SqlConnRunner{
checkConn(conn);
//查询全部
if(null == page){
if (null == page) {
List<Entity> entityList = this.find(conn, fields, where, new EntityListHandler());
final PageResult<Entity> pageResult = new PageResult<>(0, entityList.size(), entityList.size());
pageResult.addAll(entityList);
@@ -530,9 +540,9 @@ public class SqlConnRunner{
* 分页全字段查询<br>
* 此方法不会关闭Connection
*
* @param conn 数据库连接对象
* @param conn 数据库连接对象
* @param where 条件实体类(包含表名)
* @param page 分页对象
* @param page 分页对象
* @return 结果对象
* @throws SQLException SQL执行异常
*/
@@ -542,15 +552,19 @@ public class SqlConnRunner{
//---------------------------------------------------------------------------- CRUD end
//---------------------------------------------------------------------------- Getters and Setters end
/**
* @return SQL方言
*/
public Dialect getDialect() {
return dialect;
}
/**
* 设置SQL方言
*
* @param dialect 方言
* @return this
*/
public SqlConnRunner setDialect(Dialect dialect) {
this.dialect = dialect;
@@ -559,6 +573,7 @@ public class SqlConnRunner{
/**
* 设置包装器,包装器用于对表名、字段名进行符号包装(例如双引号),防止关键字与这些表名或字段冲突
*
* @param wrapperChar 包装字符字符会在SQL生成时位于表名和字段名两边null时表示取消包装
* @return this
* @since 4.0.0
@@ -569,6 +584,7 @@ public class SqlConnRunner{
/**
* 设置包装器,包装器用于对表名、字段名进行符号包装(例如双引号),防止关键字与这些表名或字段冲突
*
* @param wrapper 包装器null表示取消包装
* @return this
* @since 4.0.0
@@ -580,8 +596,8 @@ public class SqlConnRunner{
//---------------------------------------------------------------------------- Getters and Setters end
//---------------------------------------------------------------------------- Private method start
private void checkConn(Connection conn){
if(null == conn){
private void checkConn(Connection conn) {
if (null == conn) {
throw new NullPointerException("Connection object is null!");
}
}

View File

@@ -68,7 +68,7 @@ public enum ThreadLocalConnection {
*
* @param ds 数据源
* @return Connection
* @throws SQLException
* @throws SQLException SQL异常
*/
public Connection get(DataSource ds) throws SQLException {
Connection conn = connMap.get(ds);

View File

@@ -140,7 +140,7 @@ public abstract class DSFactory implements Closeable, Serializable{
/**
* 创建数据源实现工厂<br>
* 此方法通过“试错”方式查找引入项目的连接池库,按照优先级寻找,一旦寻找到则创建对应的数据源工厂<br>
* 连接池优先级Hikari > Druid > Tomcat > Dbcp > C3p0 > Hutool Pooled
* 连接池优先级Hikari &gt; Druid &gt; Tomcat &gt; Dbcp &gt; C3p0 &gt; Hutool Pooled
*
* @return 日志实现类
*/
@@ -153,7 +153,7 @@ public abstract class DSFactory implements Closeable, Serializable{
/**
* 创建数据源实现工厂<br>
* 此方法通过“试错”方式查找引入项目的连接池库,按照优先级寻找,一旦寻找到则创建对应的数据源工厂<br>
* 连接池优先级Hikari > Druid > Tomcat > Dbcp > C3p0 > Hutool Pooled
* 连接池优先级Hikari &gt; Druid &gt; Tomcat &gt; Dbcp &gt; C3p0 &gt; Hutool Pooled
*
* @return 日志实现类
* @since 4.1.3

View File

@@ -29,8 +29,9 @@ public class DataSourceWrapper implements DataSource, Closeable, Cloneable {
/**
* 包装指定的DataSource
*
* @param ds 原始的DataSource
* @param ds 原始的DataSource
* @param driver 数据库驱动类名
* @return {@link DataSourceWrapper}
*/
public static DataSourceWrapper wrap(DataSource ds, String driver) {
return new DataSourceWrapper(ds, driver);
@@ -39,7 +40,7 @@ public class DataSourceWrapper implements DataSource, Closeable, Cloneable {
/**
* 构造
*
* @param ds 原始的DataSource
* @param ds 原始的DataSource
* @param driver 数据库驱动类名
*/
public DataSourceWrapper(DataSource ds, String driver) {

View File

@@ -30,6 +30,7 @@ public class HandleHelper {
/**
* 处理单条数据
*
* @param <T> Bean类型
* @param columnCount 列数
* @param meta ResultSetMetaData
* @param rs 数据集
@@ -45,6 +46,7 @@ public class HandleHelper {
/**
* 处理单条数据
*
* @param <T> Bean类型
* @param columnCount 列数
* @param meta ResultSetMetaData
* @param rs 数据集
@@ -84,8 +86,8 @@ public class HandleHelper {
final Map<String, PropDesc> propMap = BeanUtil.getBeanDesc(beanClass).getPropMap(true);
String columnLabel;
PropDesc pd;
Method setter = null;
Object value = null;
Method setter;
Object value;
for (int i = 1; i <= columnCount; i++) {
columnLabel = meta.getColumnLabel(i);
pd = propMap.get(columnLabel);

View File

@@ -30,6 +30,7 @@ public enum SqlLog {
* @param isShowSql 是否显示SQL
* @param isFormatSql 是否格式化显示的SQL
* @param isShowParams 是否打印参数
* @param level 日志级别
*/
public void init(boolean isShowSql, boolean isFormatSql, boolean isShowParams, Level level) {
this.showSql = isShowSql;

View File

@@ -31,7 +31,7 @@ public class SqlUtil {
* 构件相等条件的where语句<br>
* 如果没有条件语句,泽返回空串,表示没有条件
*
* @param entity 条件实体
* @param entity 条件实体
* @param paramValues 条件值得存放List
* @return 带where关键字的SQL部分
*/
@@ -89,7 +89,7 @@ public class SqlUtil {
* 2、LikeType.EndWith: value%
* 3、LikeType.Contains: %value%
* </pre>
*
* <p>
* 如果withLikeKeyword为true则结果为
*
* <pre>
@@ -98,8 +98,9 @@ public class SqlUtil {
* 3、LikeType.Contains: LIKE %value%
* </pre>
*
* @param value 被查找值
* @param likeType LIKE值类型 {@link LikeType}
* @param value 被查找值
* @param likeType LIKE值类型 {@link LikeType}
* @param withLikeKeyword 是否包含LIKE关键字
* @return 拼接后的like值
*/
public static String buildLikeValue(String value, LikeType likeType, boolean withLikeKeyword) {
@@ -109,18 +110,18 @@ public class SqlUtil {
StringBuilder likeValue = StrUtil.builder(withLikeKeyword ? "LIKE " : "");
switch (likeType) {
case StartWith:
likeValue.append('%').append(value);
break;
case EndWith:
likeValue.append(value).append('%');
break;
case Contains:
likeValue.append('%').append(value).append('%');
break;
case StartWith:
likeValue.append('%').append(value);
break;
case EndWith:
likeValue.append(value).append('%');
break;
case Contains:
likeValue.append('%').append(value).append('%');
break;
default:
break;
default:
break;
}
return likeValue.toString();
}
@@ -167,7 +168,7 @@ public class SqlUtil {
/**
* Blob字段值转字符串
*
* @param blob {@link Blob}
* @param blob {@link Blob}
* @param charset 编码
* @return 字符串
* @since 3.0.6
@@ -187,8 +188,8 @@ public class SqlUtil {
/**
* 创建Blob对象
*
* @param conn {@link Connection}
* @param dataStream 数据流,使用完毕后关闭
* @param conn {@link Connection}
* @param dataStream 数据流,使用完毕后关闭
* @param closeAfterUse 使用完毕是否关闭流
* @return {@link Blob}
* @since 4.5.13

View File

@@ -42,30 +42,42 @@ import cn.hutool.setting.dialect.Props;
* </pre>
*
* @author looly
*
*/
public class Setting extends AbsSetting implements Map<String, String> {
private static final long serialVersionUID = 3618305164959883393L;
/** 默认字符集 */
/**
* 默认字符集
*/
public final static Charset DEFAULT_CHARSET = CharsetUtil.CHARSET_UTF_8;
/** 默认配置文件扩展名 */
/**
* 默认配置文件扩展名
*/
public final static String EXT_NAME = "setting";
/** 附带分组的键值对存储 */
/**
* 附带分组的键值对存储
*/
private final GroupedMap groupedMap = new GroupedMap();
/** 本设置对象的字符集 */
/**
* 本设置对象的字符集
*/
protected Charset charset;
/** 是否使用变量 */
/**
* 是否使用变量
*/
protected boolean isUseVariable;
/** 设定文件的URL */
/**
* 设定文件的URL
*/
protected URL settingUrl;
private SettingLoader settingLoader;
private WatchMonitor watchMonitor;
// ------------------------------------------------------------------------------------- Constructor start
/**
* 空构造
*/
@@ -85,7 +97,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
/**
* 构造
*
* @param path 相对路径或绝对路径
* @param path 相对路径或绝对路径
* @param isUseVariable 是否使用变量
*/
public Setting(String path, boolean isUseVariable) {
@@ -95,8 +107,8 @@ public class Setting extends AbsSetting implements Map<String, String> {
/**
* 构造使用相对于Class文件根目录的相对路径
*
* @param path 相对路径或绝对路径
* @param charset 字符集
* @param path 相对路径或绝对路径
* @param charset 字符集
* @param isUseVariable 是否使用变量
*/
public Setting(String path, Charset charset, boolean isUseVariable) {
@@ -107,8 +119,8 @@ public class Setting extends AbsSetting implements Map<String, String> {
/**
* 构造
*
* @param configFile 配置文件对象
* @param charset 字符集
* @param configFile 配置文件对象
* @param charset 字符集
* @param isUseVariable 是否使用变量
*/
public Setting(File configFile, Charset charset, boolean isUseVariable) {
@@ -119,9 +131,9 @@ public class Setting extends AbsSetting implements Map<String, String> {
/**
* 构造相对于classes读取文件
*
* @param path 相对ClassPath路径或绝对路径
* @param clazz 基准类
* @param charset 字符集
* @param path 相对ClassPath路径或绝对路径
* @param clazz 基准类
* @param charset 字符集
* @param isUseVariable 是否使用变量
*/
public Setting(String path, Class<?> clazz, Charset charset, boolean isUseVariable) {
@@ -132,8 +144,8 @@ public class Setting extends AbsSetting implements Map<String, String> {
/**
* 构造
*
* @param url 设定文件的URL
* @param charset 字符集
* @param url 设定文件的URL
* @param charset 字符集
* @param isUseVariable 是否使用变量
*/
public Setting(URL url, Charset charset, boolean isUseVariable) {
@@ -145,8 +157,8 @@ public class Setting extends AbsSetting implements Map<String, String> {
/**
* 初始化设定文件
*
* @param resource {@link Resource}
* @param charset 字符集
* @param resource {@link Resource}
* @param charset 字符集
* @param isUseVariable 是否使用变量
* @return 成功初始化与否
*/
@@ -305,6 +317,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
}
// --------------------------------------------------------------------------------- Functions
/**
* 持久化当前设置,会覆盖掉之前的设置<br>
* 持久化不会保留之前的分组
@@ -359,6 +372,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
* 正则只能有一个group表示变量本身剩余为字符 例如 \$\{(name)\}表示${name}变量名为name的一个变量表示
*
* @param regex 正则
* @return this
*/
public Setting setVarRegex(String regex) {
if (null == this.settingLoader) {
@@ -381,6 +395,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
}
// ------------------------------------------------- Map interface with group
/**
* 某个分组对应的键值对是否为空
*
@@ -395,7 +410,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
* 指定分组中是否包含指定key
*
* @param group 分组
* @param key 键
* @param key
* @return 是否包含key
*/
public boolean containsKey(String group, String key) {
@@ -417,7 +432,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
* 获取分组对应的值如果分组不存在或者值不存在则返回null
*
* @param group 分组
* @param key 键
* @param key
* @return 值如果分组不存在或者值不存在则返回null
*/
public String get(String group, String key) {
@@ -428,7 +443,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
* 将键值对加入到对应分组中
*
* @param group 分组
* @param key 键
* @param key
* @param value 值
* @return 此key之前存在的值如果没有返回null
*/
@@ -440,7 +455,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
* 从指定分组中删除指定值
*
* @param group 分组
* @param key 键
* @param key
* @return 被删除的值如果值不存在返回null
*/
public String remove(String group, Object key) {
@@ -451,7 +466,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
* 加入多个键值对到某个分组下
*
* @param group 分组
* @param m 键值对
* @param m 键值对
* @return this
*/
public Setting putAll(String group, Map<? extends String, ? extends String> m) {
@@ -503,7 +518,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
/**
* 设置值
*
* @param key 键
* @param key
* @param value 值
* @return this
* @since 3.3.1
@@ -517,7 +532,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
* 将键值对加入到对应分组中
*
* @param group 分组
* @param key 键
* @param key
* @param value 值
* @return 此key之前存在的值如果没有返回null
*/
@@ -568,7 +583,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
/**
* 将指定键值对加入到默认分组(空分组)中
*
* @param key 键
* @param key
* @param value 值
* @return 加入的值
*/

View File

@@ -485,6 +485,7 @@ public final class Props extends Properties implements BasicTypeGetter<String>,
* ['person']['friends'][5]['name']
* </pre>
*
* @param <T> Bean类型
* @param beanClass Bean类
* @return Bean对象
* @since 4.6.3
@@ -505,6 +506,7 @@ public final class Props extends Properties implements BasicTypeGetter<String>,
* ['person']['friends'][5]['name']
* </pre>
*
* @param <T> Bean类型
* @param beanClass Bean类
* @param prefix 公共前缀不指定前缀传null当指定前缀后非此前缀的属性被忽略
* @return Bean对象
@@ -527,6 +529,7 @@ public final class Props extends Properties implements BasicTypeGetter<String>,
* ['person']['friends'][5]['name']
* </pre>
*
* @param <T> Bean类型
* @param bean Bean对象
* @param prefix 公共前缀不指定前缀传null当指定前缀后非此前缀的属性被忽略
* @return Bean对象