mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
fix CombinationAnnotationElement bug
This commit is contained in:
parent
010f0554ae
commit
0aeb4d2512
@ -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)
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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) {
|
||||||
|
@ -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>
|
||||||
|
* 1、null转为"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);
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user