in dubbo-common/src/main/java/org/apache/dubbo/common/utils/ReflectUtils.java [995:1075]
private static Object getEmptyObject(Class<?> returnType, Map<Class<?>, Object> emptyInstances, int level) {
if (level > 2) {
return null;
}
if (returnType == null) {
return null;
}
if (returnType == boolean.class || returnType == Boolean.class) {
return false;
}
if (returnType == char.class || returnType == Character.class) {
return '\0';
}
if (returnType == byte.class || returnType == Byte.class) {
return (byte) 0;
}
if (returnType == short.class || returnType == Short.class) {
return (short) 0;
}
if (returnType == int.class || returnType == Integer.class) {
return 0;
}
if (returnType == long.class || returnType == Long.class) {
return 0L;
}
if (returnType == float.class || returnType == Float.class) {
return 0F;
}
if (returnType == double.class || returnType == Double.class) {
return 0D;
}
if (returnType.isArray()) {
return Array.newInstance(returnType.getComponentType(), 0);
}
if (returnType.isAssignableFrom(ArrayList.class)) {
return new ArrayList<>(0);
}
if (returnType.isAssignableFrom(HashSet.class)) {
return new HashSet<>(0);
}
if (returnType.isAssignableFrom(HashMap.class)) {
return new HashMap<>(0);
}
if (String.class.equals(returnType)) {
return "";
}
if (returnType.isInterface()) {
return null;
}
try {
Object value = emptyInstances.get(returnType);
if (value == null) {
value = returnType.getDeclaredConstructor().newInstance();
emptyInstances.put(returnType, value);
}
Class<?> cls = value.getClass();
while (cls != null && cls != Object.class) {
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
if (field.isSynthetic()) {
continue;
}
Object property = getEmptyObject(field.getType(), emptyInstances, level + 1);
if (property != null) {
try {
if (!field.isAccessible()) {
field.setAccessible(true);
}
field.set(value, property);
} catch (Throwable ignored) {
}
}
}
cls = cls.getSuperclass();
}
return value;
} catch (Throwable e) {
return null;
}
}