Browse Source

fix CombinationAnnotationElement bug

Looly 6 years ago
parent
commit
0aeb4d2512

+ 2 - 0
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)
 
 -------------------------------------------------------------------------------------------------------------
 

+ 5 - 4
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的组合注解。<br>
@@ -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<? extends Annotation> annotationType;

+ 30 - 36
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<Integer> set = new HashSet<Integer>();
+		Set<Integer> 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,使用大端字节序(高位字节在前,低位字节在后)<br>
 	 * 见: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);
 	}
 
+	/**
+	 * 检查是否为有效的数字<br>
+	 * 检查Double和Float是否为无限大,或者Not a Number<br>
+	 * 非数字类型和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) {

+ 30 - 35
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 {
 	 * <li>Array</li>
 	 * </ul>
 	 *
-	 * @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<br>
 	 * 判断标准为:
-	 * 
+	 *
 	 * <pre>
 	 * 1. == null
 	 * 2. equals(null)
@@ -265,8 +263,8 @@ public class ObjectUtil {
 	 * ObjectUtil.defaultIfNull(Boolean.TRUE, *) = Boolean.TRUE
 	 * </pre>
 	 *
-	 * @param <T> 对象类型
-	 * @param object 被检查对象,可能为{@code null}
+	 * @param <T>          对象类型
+	 * @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> 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 <T> 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();
 	}
-	
+
 	/**
 	 * 反序列化<br>
 	 * 对象必须实现Serializable接口
 	 *
-	 * @param <T> 对象类型
+	 * @param <T>   对象类型
 	 * @param bytes 反序列化的字节码
 	 * @return 反序列化后的对象
 	 * @see #unserialize(byte[])
@@ -387,13 +385,13 @@ public class ObjectUtil {
 	 * 反序列化<br>
 	 * 对象必须实现Serializable接口
 	 *
-	 * @param <T> 对象类型
+	 * @param <T>   对象类型
 	 * @param bytes 反序列化的字节码
 	 * @return 反序列化后的对象
 	 */
 	@SuppressWarnings("unchecked")
 	public static <T> 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 <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,返回数小于0,c1==c2返回0,c1 &gt; c2 大于0
 	 * @see java.util.Comparator#compare(Object, Object)
 	 * @since 3.0.7
@@ -454,9 +444,9 @@ public class ObjectUtil {
 	/**
 	 * {@code null}安全的对象比较
 	 *
-	 * @param <T> 被比较对象类型
-	 * @param c1 对象1,可以为{@code null}
-	 * @param c2 对象2,可以为{@code null}
+	 * @param <T>         被比较对象类型
+	 * @param c1          对象1,可以为{@code null}
+	 * @param c2          对象2,可以为{@code null}
 	 * @param nullGreater 当被比较对象为null时是否排在前面
 	 * @return 比较结果,如果c1 &lt; c2,返回数小于0,c1==c2返回0,c1 &gt; 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<br>
+	 * 策略为:
+	 * <pre>
+	 *  1、null转为"null"
+	 *  2、调用Convert.toStr(Object)转换
+	 * </pre>
 	 *
 	 * @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);

+ 5 - 5
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;