diff --git a/CHANGELOG.md b/CHANGELOG.md index dbab0841a..215794fb5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,11 +10,13 @@ * 【http】 body方法传null跳过而非报错(issue#I12AP2@Gitee) * 【core】 TimeInterval增加intervalPretty方法(issue#I12A6T@Gitee) * 【core】 改进ArrayUtil.toString,提高性能 + ### Bug修复 * 【core】 修复DateUtil.offset导致的时区错误问题(issue#I1294O@Gitee) * 【core】 修复RuntimeUtil.exec重载导致的问题(issue#544@Github) * 【db】 修复StatementUtil.getGeneratedKeys返回主键数量不足问题 * 【db】 修复锁的问题(issue#546@Github) +* 【db】 修复CombinationAnnotationElement问题(issue#547@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/CombinationAnnotationElement.java b/hutool-core/src/main/java/cn/hutool/core/annotation/CombinationAnnotationElement.java index 380405610..efe14cfbf 100644 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/CombinationAnnotationElement.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/CombinationAnnotationElement.java @@ -13,6 +13,7 @@ import java.util.Map; import java.util.Set; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; /** * 组合注解 对JDK的原生注解机制做一个增强,支持类似Spring的组合注解。
@@ -79,12 +80,12 @@ public class CombinationAnnotationElement implements AnnotatedElement, Serializa * @param element 元素 */ private void init(AnnotatedElement element) { - Annotation[] declaredAnnotations = element.getDeclaredAnnotations(); + final Annotation[] declaredAnnotations = element.getDeclaredAnnotations(); this.declaredAnnotationMap = new HashMap<>(); parseDeclared(declaredAnnotations); - Annotation[] annotations = element.getAnnotations(); - if(declaredAnnotations == annotations) { + final Annotation[] annotations = element.getAnnotations(); + if(ObjectUtil.equal(declaredAnnotations, annotations)) { this.annotationMap = this.declaredAnnotationMap; }else { this.annotationMap = new HashMap<>(); @@ -112,7 +113,7 @@ public class CombinationAnnotationElement implements AnnotatedElement, Serializa /** * 进行递归解析注解,直到全部都是元注解为止 * - * @param element Class, Method, Field等 + * @param annotations Class, Method, Field等 */ private void parse(Annotation[] annotations) { Class annotationType; diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 7766d1736..0c9ed58c1 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -1195,13 +1195,11 @@ public class NumberUtil { public static boolean isDouble(String s) { try { Double.parseDouble(s); - if (s.contains(".")) { - return true; - } - return false; - } catch (NumberFormatException e) { - return false; + return s.contains("."); + } catch (NumberFormatException ignore) { + // ignore } + return false; } /** @@ -1281,13 +1279,12 @@ public class NumberUtil { } Random ran = new Random(); - Set set = new HashSet(); + Set set = new HashSet<>(); while (set.size() < size) { set.add(begin + ran.nextInt(end - begin)); } - Integer[] ranArr = set.toArray(new Integer[size]); - return ranArr; + return set.toArray(new Integer[size]); } // ------------------------------------------------------------------------------------------- range @@ -1553,14 +1550,7 @@ public class NumberUtil { * @since 3.0.1 */ public static int compare(int x, int y) { - if (x == y) { - return 0; - } - if (x < y) { - return -1; - } else { - return 1; - } + return Integer.compare(x, y); } /** @@ -1574,14 +1564,7 @@ public class NumberUtil { * @since 3.0.1 */ public static int compare(long x, long y) { - if (x == y) { - return 0; - } - if (x < y) { - return -1; - } else { - return 1; - } + return Long.compare(x, y); } /** @@ -1595,14 +1578,7 @@ public class NumberUtil { * @since 3.0.1 */ public static int compare(short x, short y) { - if (x == y) { - return 0; - } - if (x < y) { - return -1; - } else { - return 1; - } + return Short.compare(x, y); } /** @@ -1616,7 +1592,7 @@ public class NumberUtil { * @since 3.0.1 */ public static int compare(byte x, byte y) { - return x - y; + return Byte.compare(x, y); } /** @@ -2078,7 +2054,7 @@ public class NumberUtil { * @since 4.0.7 */ public static int partValue(int total, int partCount, boolean isPlusOneWhenHasRem) { - int partValue = 0; + int partValue; if (total % partCount == 0) { partValue = total / partCount; } else { @@ -2222,7 +2198,7 @@ public class NumberUtil { * byte数组转int,使用大端字节序(高位字节在前,低位字节在后)
* 见:http://www.ruanyifeng.com/blog/2016/11/byte-order.html * - * @param bytes + * @param bytes byte数组 * @return int * @since 4.4.5 */ @@ -2307,6 +2283,24 @@ public class NumberUtil { return new BigInteger(1, mag); } + /** + * 检查是否为有效的数字
+ * 检查Double和Float是否为无限大,或者Not a Number
+ * 非数字类型和Null将返回true + * + * @param number 被检查类型 + * @return 检查结果,非数字类型和Null将返回true + * @since 4.6.7 + */ + public static boolean isValidNumber(Number number) { + if (number instanceof Double) { + return (false == ((Double) number).isInfinite()) && (false == ((Double) number).isNaN()); + } else if (number instanceof Float) { + return (false == ((Float) number).isInfinite()) && (false == ((Float) number).isNaN()); + } + return true; + } + // ------------------------------------------------------------------------------------------- Private method start private static int mathSubnode(int selectNum, int minNum) { if (selectNum == minNum) { diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java index d507e42f5..6c758b223 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java @@ -13,10 +13,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.lang.reflect.Array; -import java.util.Collection; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.Map; +import java.util.*; /** * 对象工具类,包括判空、克隆、序列化等操作 @@ -37,10 +34,11 @@ public class ObjectUtil { * @param obj1 对象1 * @param obj2 对象2 * @return 是否相等 + * @see Objects#equals(Object, Object) */ public static boolean equal(Object obj1, Object obj2) { // return (obj1 != null) ? (obj1.equals(obj2)) : (obj2 == null); - return (obj1 == obj2) || (obj1 != null && obj1.equals(obj2)); + return Objects.equals(obj1, obj2); } /** @@ -120,7 +118,7 @@ public class ObjectUtil { *
  • Array
  • * * - * @param obj 对象 + * @param obj 对象 * @param element 元素 * @return 是否包含 */ @@ -138,7 +136,7 @@ public class ObjectUtil { return ((Collection) obj).contains(element); } if (obj instanceof Map) { - return ((Map) obj).values().contains(element); + return ((Map) obj).containsValue(element); } if (obj instanceof Iterator) { @@ -176,7 +174,7 @@ public class ObjectUtil { /** * 检查对象是否为null
    * 判断标准为: - * + * *
     	 * 1. == null
     	 * 2. equals(null)
    @@ -265,8 +263,8 @@ public class ObjectUtil {
     	 * ObjectUtil.defaultIfNull(Boolean.TRUE, *) = Boolean.TRUE
     	 * 
    * - * @param 对象类型 - * @param object 被检查对象,可能为{@code null} + * @param 对象类型 + * @param object 被检查对象,可能为{@code null} * @param defaultValue 被检查对象为{@code null}返回的默认值,可以为{@code null} * @return 被检查对象为{@code null}返回默认值,否则返回原值 * @since 3.0.7 @@ -325,7 +323,7 @@ public class ObjectUtil { */ @SuppressWarnings("unchecked") public static T cloneByStream(T obj) { - if (null == obj || false == (obj instanceof Serializable)) { + if (false == (obj instanceof Serializable)) { return null; } final FastByteArrayOutputStream byteOut = new FastByteArrayOutputStream(); @@ -352,7 +350,7 @@ public class ObjectUtil { * @return 序列化后的字节码 */ public static byte[] serialize(T obj) { - if (null == obj || false == (obj instanceof Serializable)) { + if (false == (obj instanceof Serializable)) { return null; } @@ -369,12 +367,12 @@ public class ObjectUtil { } return byteOut.toByteArray(); } - + /** * 反序列化
    * 对象必须实现Serializable接口 * - * @param 对象类型 + * @param 对象类型 * @param bytes 反序列化的字节码 * @return 反序列化后的对象 * @see #unserialize(byte[]) @@ -387,13 +385,13 @@ public class ObjectUtil { * 反序列化
    * 对象必须实现Serializable接口 * - * @param 对象类型 + * @param 对象类型 * @param bytes 反序列化的字节码 * @return 反序列化后的对象 */ @SuppressWarnings("unchecked") public static T unserialize(byte[] bytes) { - ObjectInputStream ois = null; + ObjectInputStream ois; try { ByteArrayInputStream bais = new ByteArrayInputStream(bytes); ois = new ObjectInputStream(bais); @@ -423,16 +421,8 @@ public class ObjectUtil { * @return 检查结果,非数字类型和Null将返回true */ public static boolean isValidIfNumber(Object obj) { - if (obj != null && obj instanceof Number) { - if (obj instanceof Double) { - if (((Double) obj).isInfinite() || ((Double) obj).isNaN()) { - return false; - } - } else if (obj instanceof Float) { - if (((Float) obj).isInfinite() || ((Float) obj).isNaN()) { - return false; - } - } + if (obj instanceof Number) { + return NumberUtil.isValidNumber((Number) obj); } return true; } @@ -441,8 +431,8 @@ public class ObjectUtil { * {@code null}安全的对象比较,{@code null}对象排在末尾 * * @param 被比较对象类型 - * @param c1 对象1,可以为{@code null} - * @param c2 对象2,可以为{@code null} + * @param c1 对象1,可以为{@code null} + * @param c2 对象2,可以为{@code null} * @return 比较结果,如果c1 < c2,返回数小于0,c1==c2返回0,c1 > c2 大于0 * @see java.util.Comparator#compare(Object, Object) * @since 3.0.7 @@ -454,9 +444,9 @@ public class ObjectUtil { /** * {@code null}安全的对象比较 * - * @param 被比较对象类型 - * @param c1 对象1,可以为{@code null} - * @param c2 对象2,可以为{@code null} + * @param 被比较对象类型 + * @param c1 对象1,可以为{@code null} + * @param c2 对象2,可以为{@code null} * @param nullGreater 当被比较对象为null时是否排在前面 * @return 比较结果,如果c1 < c2,返回数小于0,c1==c2返回0,c1 > c2 大于0 * @see java.util.Comparator#compare(Object, Object) @@ -480,7 +470,7 @@ public class ObjectUtil { /** * 获得给定类的第一个泛型参数 * - * @param obj 被检查的对象 + * @param obj 被检查的对象 * @param index 泛型类型的索引号,既第几个泛型类型 * @return {@link Class} * @since 3.0.8 @@ -490,7 +480,12 @@ public class ObjectUtil { } /** - * 将Object转为String + * 将Object转为String
    + * 策略为: + *
    +	 *  1、null转为"null"
    +	 *  2、调用Convert.toStr(Object)转换
    +	 * 
    * * @param obj Bean对象 * @return Bean所有字段转为Map后的字符串 @@ -498,10 +493,10 @@ public class ObjectUtil { */ public static String toString(Object obj) { if (null == obj) { - return "null"; + return StrUtil.NULL; } if (obj instanceof Map) { - return ((Map) obj).toString(); + return obj.toString(); } return Convert.toStr(obj); diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/Mode.java b/hutool-crypto/src/main/java/cn/hutool/crypto/Mode.java index 2b964e249..a9a1fc0b7 100644 --- a/hutool-crypto/src/main/java/cn/hutool/crypto/Mode.java +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/Mode.java @@ -9,17 +9,17 @@ package cn.hutool.crypto; public enum Mode{ /** 无模式 */ NONE, - /** Cipher Block Chaining */ + /** 密码分组连接模式(Cipher Block Chaining) */ CBC, - /** Cipher Feedback */ + /** 密文反馈模式(Cipher Feedback) */ CFB, - /** A simplification of OFB */ + /** 计数器模式(A simplification of OFB) */ CTR, /** Cipher Text Stealing */ CTS, - /** Electronic Codebook */ + /** 电子密码本模式(Electronic CodeBook) */ ECB, - /** Output Feedback */ + /** 输出反馈模式(Output Feedback) */ OFB, /** Propagating Cipher Block */ PCBC;