fix CombinationAnnotationElement bug

This commit is contained in:
Looly 2019-09-19 16:35:26 +08:00
parent 010f0554ae
commit 0aeb4d2512
5 changed files with 72 additions and 80 deletions

View File

@ -10,11 +10,13 @@
* 【http】 body方法传null跳过而非报错issue#I12AP2@Gitee * 【http】 body方法传null跳过而非报错issue#I12AP2@Gitee
* 【core】 TimeInterval增加intervalPretty方法issue#I12A6T@Gitee * 【core】 TimeInterval增加intervalPretty方法issue#I12A6T@Gitee
* 【core】 改进ArrayUtil.toString提高性能 * 【core】 改进ArrayUtil.toString提高性能
### Bug修复 ### Bug修复
* 【core】 修复DateUtil.offset导致的时区错误问题issue#I1294O@Gitee * 【core】 修复DateUtil.offset导致的时区错误问题issue#I1294O@Gitee
* 【core】 修复RuntimeUtil.exec重载导致的问题issue#544@Github * 【core】 修复RuntimeUtil.exec重载导致的问题issue#544@Github
* 【db】 修复StatementUtil.getGeneratedKeys返回主键数量不足问题 * 【db】 修复StatementUtil.getGeneratedKeys返回主键数量不足问题
* 【db】 修复锁的问题issue#546@Github * 【db】 修复锁的问题issue#546@Github
* 【db】 修复CombinationAnnotationElement问题issue#547@Github
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------

View File

@ -13,6 +13,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
/** /**
* 组合注解 对JDK的原生注解机制做一个增强支持类似Spring的组合注解<br> * 组合注解 对JDK的原生注解机制做一个增强支持类似Spring的组合注解<br>
@ -79,12 +80,12 @@ public class CombinationAnnotationElement implements AnnotatedElement, Serializa
* @param element 元素 * @param element 元素
*/ */
private void init(AnnotatedElement element) { private void init(AnnotatedElement element) {
Annotation[] declaredAnnotations = element.getDeclaredAnnotations(); final Annotation[] declaredAnnotations = element.getDeclaredAnnotations();
this.declaredAnnotationMap = new HashMap<>(); this.declaredAnnotationMap = new HashMap<>();
parseDeclared(declaredAnnotations); parseDeclared(declaredAnnotations);
Annotation[] annotations = element.getAnnotations(); final Annotation[] annotations = element.getAnnotations();
if(declaredAnnotations == annotations) { if(ObjectUtil.equal(declaredAnnotations, annotations)) {
this.annotationMap = this.declaredAnnotationMap; this.annotationMap = this.declaredAnnotationMap;
}else { }else {
this.annotationMap = new HashMap<>(); 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) { private void parse(Annotation[] annotations) {
Class<? extends Annotation> annotationType; Class<? extends Annotation> annotationType;

View File

@ -1195,13 +1195,11 @@ public class NumberUtil {
public static boolean isDouble(String s) { public static boolean isDouble(String s) {
try { try {
Double.parseDouble(s); Double.parseDouble(s);
if (s.contains(".")) { return s.contains(".");
return true; } catch (NumberFormatException ignore) {
// ignore
} }
return false; return false;
} catch (NumberFormatException e) {
return false;
}
} }
/** /**
@ -1281,13 +1279,12 @@ public class NumberUtil {
} }
Random ran = new Random(); Random ran = new Random();
Set<Integer> set = new HashSet<Integer>(); Set<Integer> set = new HashSet<>();
while (set.size() < size) { while (set.size() < size) {
set.add(begin + ran.nextInt(end - begin)); set.add(begin + ran.nextInt(end - begin));
} }
Integer[] ranArr = set.toArray(new Integer[size]); return set.toArray(new Integer[size]);
return ranArr;
} }
// ------------------------------------------------------------------------------------------- range // ------------------------------------------------------------------------------------------- range
@ -1553,14 +1550,7 @@ public class NumberUtil {
* @since 3.0.1 * @since 3.0.1
*/ */
public static int compare(int x, int y) { public static int compare(int x, int y) {
if (x == y) { return Integer.compare(x, y);
return 0;
}
if (x < y) {
return -1;
} else {
return 1;
}
} }
/** /**
@ -1574,14 +1564,7 @@ public class NumberUtil {
* @since 3.0.1 * @since 3.0.1
*/ */
public static int compare(long x, long y) { public static int compare(long x, long y) {
if (x == y) { return Long.compare(x, y);
return 0;
}
if (x < y) {
return -1;
} else {
return 1;
}
} }
/** /**
@ -1595,14 +1578,7 @@ public class NumberUtil {
* @since 3.0.1 * @since 3.0.1
*/ */
public static int compare(short x, short y) { public static int compare(short x, short y) {
if (x == y) { return Short.compare(x, y);
return 0;
}
if (x < y) {
return -1;
} else {
return 1;
}
} }
/** /**
@ -1616,7 +1592,7 @@ public class NumberUtil {
* @since 3.0.1 * @since 3.0.1
*/ */
public static int compare(byte x, byte y) { 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 * @since 4.0.7
*/ */
public static int partValue(int total, int partCount, boolean isPlusOneWhenHasRem) { public static int partValue(int total, int partCount, boolean isPlusOneWhenHasRem) {
int partValue = 0; int partValue;
if (total % partCount == 0) { if (total % partCount == 0) {
partValue = total / partCount; partValue = total / partCount;
} else { } else {
@ -2222,7 +2198,7 @@ public class NumberUtil {
* byte数组转int使用大端字节序高位字节在前低位字节在后<br> * byte数组转int使用大端字节序高位字节在前低位字节在后<br>
* http://www.ruanyifeng.com/blog/2016/11/byte-order.html * http://www.ruanyifeng.com/blog/2016/11/byte-order.html
* *
* @param bytes * @param bytes byte数组
* @return int * @return int
* @since 4.4.5 * @since 4.4.5
*/ */
@ -2307,6 +2283,24 @@ public class NumberUtil {
return new BigInteger(1, mag); 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 method start
private static int mathSubnode(int selectNum, int minNum) { private static int mathSubnode(int selectNum, int minNum) {
if (selectNum == minNum) { if (selectNum == minNum) {

View File

@ -13,10 +13,7 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; import java.io.ObjectOutputStream;
import java.io.Serializable; import java.io.Serializable;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.util.Collection; import java.util.*;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
/** /**
* 对象工具类包括判空克隆序列化等操作 * 对象工具类包括判空克隆序列化等操作
@ -37,10 +34,11 @@ public class ObjectUtil {
* @param obj1 对象1 * @param obj1 对象1
* @param obj2 对象2 * @param obj2 对象2
* @return 是否相等 * @return 是否相等
* @see Objects#equals(Object, Object)
*/ */
public static boolean equal(Object obj1, Object obj2) { public static boolean equal(Object obj1, Object obj2) {
// return (obj1 != null) ? (obj1.equals(obj2)) : (obj2 == null); // return (obj1 != null) ? (obj1.equals(obj2)) : (obj2 == null);
return (obj1 == obj2) || (obj1 != null && obj1.equals(obj2)); return Objects.equals(obj1, obj2);
} }
/** /**
@ -138,7 +136,7 @@ public class ObjectUtil {
return ((Collection<?>) obj).contains(element); return ((Collection<?>) obj).contains(element);
} }
if (obj instanceof Map) { if (obj instanceof Map) {
return ((Map<?, ?>) obj).values().contains(element); return ((Map<?, ?>) obj).containsValue(element);
} }
if (obj instanceof Iterator) { if (obj instanceof Iterator) {
@ -325,7 +323,7 @@ public class ObjectUtil {
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <T> T cloneByStream(T obj) { public static <T> T cloneByStream(T obj) {
if (null == obj || false == (obj instanceof Serializable)) { if (false == (obj instanceof Serializable)) {
return null; return null;
} }
final FastByteArrayOutputStream byteOut = new FastByteArrayOutputStream(); final FastByteArrayOutputStream byteOut = new FastByteArrayOutputStream();
@ -352,7 +350,7 @@ public class ObjectUtil {
* @return 序列化后的字节码 * @return 序列化后的字节码
*/ */
public static <T> byte[] serialize(T obj) { public static <T> byte[] serialize(T obj) {
if (null == obj || false == (obj instanceof Serializable)) { if (false == (obj instanceof Serializable)) {
return null; return null;
} }
@ -393,7 +391,7 @@ public class ObjectUtil {
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <T> T unserialize(byte[] bytes) { public static <T> T unserialize(byte[] bytes) {
ObjectInputStream ois = null; ObjectInputStream ois;
try { try {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes); ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ois = new ObjectInputStream(bais); ois = new ObjectInputStream(bais);
@ -423,16 +421,8 @@ public class ObjectUtil {
* @return 检查结果非数字类型和Null将返回true * @return 检查结果非数字类型和Null将返回true
*/ */
public static boolean isValidIfNumber(Object obj) { public static boolean isValidIfNumber(Object obj) {
if (obj != null && obj instanceof Number) { if (obj instanceof Number) {
if (obj instanceof Double) { return NumberUtil.isValidNumber((Number) obj);
if (((Double) obj).isInfinite() || ((Double) obj).isNaN()) {
return false;
}
} else if (obj instanceof Float) {
if (((Float) obj).isInfinite() || ((Float) obj).isNaN()) {
return false;
}
}
} }
return true; return true;
} }
@ -490,7 +480,12 @@ public class ObjectUtil {
} }
/** /**
* 将Object转为String * 将Object转为String<br>
* 策略为
* <pre>
* 1null转为"null"
* 2调用Convert.toStr(Object)转换
* </pre>
* *
* @param obj Bean对象 * @param obj Bean对象
* @return Bean所有字段转为Map后的字符串 * @return Bean所有字段转为Map后的字符串
@ -498,10 +493,10 @@ public class ObjectUtil {
*/ */
public static String toString(Object obj) { public static String toString(Object obj) {
if (null == obj) { if (null == obj) {
return "null"; return StrUtil.NULL;
} }
if (obj instanceof Map) { if (obj instanceof Map) {
return ((Map<?, ?>) obj).toString(); return obj.toString();
} }
return Convert.toStr(obj); return Convert.toStr(obj);

View File

@ -9,17 +9,17 @@ package cn.hutool.crypto;
public enum Mode{ public enum Mode{
/** 无模式 */ /** 无模式 */
NONE, NONE,
/** Cipher Block Chaining */ /** 密码分组连接模式(Cipher Block Chaining */
CBC, CBC,
/** Cipher Feedback */ /** 密文反馈模式(Cipher Feedback */
CFB, CFB,
/** A simplification of OFB */ /** 计数器模式(A simplification of OFB */
CTR, CTR,
/** Cipher Text Stealing */ /** Cipher Text Stealing */
CTS, CTS,
/** Electronic Codebook */ /** 电子密码本模式Electronic CodeBook */
ECB, ECB,
/** Output Feedback */ /** 输出反馈模式(Output Feedback */
OFB, OFB,
/** Propagating Cipher Block */ /** Propagating Cipher Block */
PCBC; PCBC;