根据类型自动生成对象
public static Object generateObject(Type type) throws Exception {
Object object = getRandomValue(type);
if (object != null) {
return object;
}
if (!(type instanceof Class)) {
return null;
}
Class<?> clazz = (Class<?>) type;
object = clazz.newInstance();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
Object value = generateObject(field.getGenericType());
field.set(object, value);
}
return object;
}
private static Object getRandomValue(Type type) throws Exception {
Random random = new Random();
if (type instanceof Class) {
Class<?> clazz = (Class<?>) type;
if (clazz == int.class || clazz == Integer.class) {
return random.nextInt();
} else if (clazz == long.class || clazz == Long.class) {
return random.nextLong();
} else if (clazz == double.class || clazz == Double.class) {
return random.nextDouble();
} else if (clazz == float.class || clazz == Float.class) {
return random.nextFloat();
} else if (clazz == boolean.class || clazz == Boolean.class) {
return random.nextBoolean();
} else if (clazz == char.class || clazz == Character.class) {
return (char) random.nextInt(128);
} else if (clazz == String.class) {
return getRandomString();
} else if (clazz.isArray()) {
Class<?> componentType = clazz.getComponentType();
int length = random.nextInt(5) + 1; // 随机数组长度为1到5
Object array = Array.newInstance(componentType, length);
for (int i = 0; i < length; i++) {
Object element = generateObject(componentType);
Array.set(array, i, element);
}
return array;
}
} else if (type instanceof ParameterizedType) {
Type rawType = ((ParameterizedType) type).getRawType();
if (rawType instanceof Class) {
Class<?> clazz = (Class<?>) rawType;
if (List.class.isAssignableFrom(clazz)) {
// 随机列表长度为1到5
int size = random.nextInt(5) + 1;
List<Object> list = new ArrayList<>();
for (int i = 0; i < size; i++) {
Object element = generateObject(((ParameterizedType) type).getActualTypeArguments()[0]);
list.add(element);
}
return list;
}
}
}
return null;
}
private static String getRandomString() {
Random random = new Random();
int length = 5 + random.nextInt(10);
String characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
int index = random.nextInt(characters.length());
sb.append(characters.charAt(index));
}
return sb.toString();
}