修复ReflectUtil.newInstanceIfPossible传入Object逻辑错误(pr#4160@Github)

This commit is contained in:
Looly 2025-11-26 16:30:34 +08:00
parent 472b0d2841
commit 449df10509
3 changed files with 72 additions and 24 deletions

View File

@ -31,6 +31,7 @@
* 【core 】 修复`URLUtil.url`未断开连接问题pr#4149@Github * 【core 】 修复`URLUtil.url`未断开连接问题pr#4149@Github
* 【core 】 修复`Bimap.put`重复put问题pr#4150@Github * 【core 】 修复`Bimap.put`重复put问题pr#4150@Github
* 【core 】 修复`StrUtil.str(ByteBuffer, Charset)` 方法修改入参 `ByteBuffer``position`,导致入参变化 pr#4153@Github * 【core 】 修复`StrUtil.str(ByteBuffer, Charset)` 方法修改入参 `ByteBuffer``position`,导致入参变化 pr#4153@Github
* 【core 】 修复`ReflectUtil.newInstanceIfPossible`传入Object逻辑错误pr#4160@Github
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------
# 5.8.41(2025-10-12) # 5.8.41(2025-10-12)

View File

@ -888,6 +888,7 @@ public class ReflectUtil {
return (T) ClassUtil.getPrimitiveDefaultValue(type); return (T) ClassUtil.getPrimitiveDefaultValue(type);
} }
if (Object.class != type) {
// 某些特殊接口的实例化按照默认实现进行 // 某些特殊接口的实例化按照默认实现进行
if (type.isAssignableFrom(AbstractMap.class)) { if (type.isAssignableFrom(AbstractMap.class)) {
type = (Class<T>) HashMap.class; type = (Class<T>) HashMap.class;
@ -895,6 +896,11 @@ public class ReflectUtil {
type = (Class<T>) ArrayList.class; type = (Class<T>) ArrayList.class;
} else if (type.isAssignableFrom(Set.class)) { } else if (type.isAssignableFrom(Set.class)) {
type = (Class<T>) HashSet.class; type = (Class<T>) HashSet.class;
} else if (type.isAssignableFrom(Queue.class)) {
type = (Class<T>) LinkedList.class;
} else if (type.isAssignableFrom(Deque.class)) {
type = (Class<T>) LinkedList.class;
}
} }
try { try {

View File

@ -210,6 +210,7 @@ public class ReflectUtilTest {
private String n; private String n;
} }
@SuppressWarnings("UnusedReturnValue")
public static Method getMethodWithReturnTypeCheck(final Class<?> clazz, final boolean ignoreCase, final String methodName, final Class<?>... paramTypes) throws SecurityException { public static Method getMethodWithReturnTypeCheck(final Class<?> clazz, final boolean ignoreCase, final String methodName, final Class<?>... paramTypes) throws SecurityException {
if (null == clazz || StrUtil.isBlank(methodName)) { if (null == clazz || StrUtil.isBlank(methodName)) {
return null; return null;
@ -300,6 +301,7 @@ public class ReflectUtilTest {
} }
class C2 extends C1 { class C2 extends C1 {
@SuppressWarnings("RedundantMethodOverride")
@Override @Override
public void getA() { public void getA() {
@ -371,4 +373,43 @@ public class ReflectUtilTest {
} }
} }
@Test
public void newInstanceIfPossibleTest2() {
// 测试Object.class不应该被错误地实例化为HashMap应该返回Object实例
Object objectInstance = ReflectUtil.newInstanceIfPossible(Object.class);
assertNotNull(objectInstance);
assertEquals(Object.class, objectInstance.getClass());
// 测试Map.class能够正确实例化为HashMap
Map<?, ?> mapInstance = ReflectUtil.newInstanceIfPossible(Map.class);
assertNotNull(mapInstance);
assertInstanceOf(HashMap.class, mapInstance);
// 测试Collection.class能够正确实例化为ArrayList
Collection<?> collectionInstance = ReflectUtil.newInstanceIfPossible(Collection.class);
assertNotNull(collectionInstance);
assertInstanceOf(ArrayList.class, collectionInstance);
// 测试List.class能够正确实例化为ArrayList
List<?> listInstance = ReflectUtil.newInstanceIfPossible(List.class);
assertNotNull(listInstance);
assertInstanceOf(ArrayList.class, listInstance);
// 测试Set.class能够正确实例化为HashSet
Set<?> setInstance = ReflectUtil.newInstanceIfPossible(Set.class);
assertNotNull(setInstance);
assertInstanceOf(HashSet.class, setInstance);
// 测试Queue接口能够正确实例化为LinkedList
Queue<?> queueInstance = ReflectUtil.newInstanceIfPossible(Queue.class);
assertNotNull(queueInstance);
assertInstanceOf(LinkedList.class, queueInstance);
// 测试Deque接口能够正确实例化为LinkedList
Deque<?> dequeInstance = ReflectUtil.newInstanceIfPossible(Deque.class);
assertNotNull(dequeInstance);
assertInstanceOf(LinkedList.class, dequeInstance);
}
} }