修复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 】 修复`Bimap.put`重复put问题pr#4150@Github
* 【core 】 修复`StrUtil.str(ByteBuffer, Charset)` 方法修改入参 `ByteBuffer``position`,导致入参变化 pr#4153@Github
* 【core 】 修复`ReflectUtil.newInstanceIfPossible`传入Object逻辑错误pr#4160@Github
-------------------------------------------------------------------------------------------------------------
# 5.8.41(2025-10-12)

View File

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

View File

@ -210,6 +210,7 @@ public class ReflectUtilTest {
private String n;
}
@SuppressWarnings("UnusedReturnValue")
public static Method getMethodWithReturnTypeCheck(final Class<?> clazz, final boolean ignoreCase, final String methodName, final Class<?>... paramTypes) throws SecurityException {
if (null == clazz || StrUtil.isBlank(methodName)) {
return null;
@ -300,6 +301,7 @@ public class ReflectUtilTest {
}
class C2 extends C1 {
@SuppressWarnings("RedundantMethodOverride")
@Override
public void getA() {
@ -307,7 +309,7 @@ public class ReflectUtilTest {
}
@Test
public void newInstanceIfPossibleTest(){
public void newInstanceIfPossibleTest() {
//noinspection ConstantConditions
final int intValue = ReflectUtil.newInstanceIfPossible(int.class);
assertEquals(0, intValue);
@ -351,24 +353,63 @@ public class ReflectUtilTest {
}
@Test
public void issue2625Test(){
public void issue2625Test() {
// 内部类继承的情况下父类方法会被定义为桥接方法因此按照pr#1965@Github判断返回值的继承关系来代替判断桥接
final Method getThis = ReflectUtil.getMethod(A.C.class, "getThis");
assertTrue(getThis.isBridge());
}
@SuppressWarnings("InnerClassMayBeStatic")
public class A{
public class A {
public class C extends B{
public class C extends B {
}
protected class B{
public B getThis(){
protected class B {
public B getThis() {
return this;
}
}
}
@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);
}
}