public class Test {
private static <T> Object gen2(Class<T> baseClass, Class<?>... genParams) {
try {
// 泛型参数
T obj = baseClass.newInstance();
// 泛型参数值生成
List<Object> genObj = new ArrayList<>();
for (Class<?> p : genParams) {
Field[] fields = p.getDeclaredFields();
Object newP = p.newInstance();
for (Field field : fields) {
field.setAccessible(true);
field.set(newP, getDefaultValue(field.getType()));
}
genObj.add(newP);
}
// 按字段顺序来
List<Field> tvField = new ArrayList<>();
Field[] baseFields = baseClass.getDeclaredFields();
for (Field baseF : baseFields) {
baseF.setAccessible(true);
baseF.set(obj, getDefaultValue(baseF.getType()));
Type t = baseF.getGenericType();
// 判断字段是否为泛型参数
if (t instanceof TypeVariable) {
tvField.add(baseF);
}
}
// 泛型参数赋值
for (int i = 0; i < tvField.size(); i++) {
Field f = tvField.get(i);
f.setAccessible(true);
f.set(obj, genObj.get(i));
}
return obj;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static Object getDefaultValue(Class<?> fieldType) {
if (fieldType == String.class) {
return "defaultString";
} else if (fieldType == int.class || fieldType == Integer.class) {
return 6666;
} else if (fieldType == long.class || fieldType == Long.class) {
return 6666L;
} else if (fieldType == double.class || fieldType == Double.class) {
return 66.66;
} else if (fieldType == boolean.class || fieldType == Boolean.class) {
return false;
} else if (fieldType == char.class || fieldType == Character.class) {
return '\u0000';
} else if (fieldType == float.class || fieldType == Float.class) {
return 66.66f;
} else if (fieldType == short.class || fieldType == Short.class) {
return (short) 666;
} else if (fieldType == byte.class || fieldType == Byte.class) {
return (byte) 6666;
} else {
// 如果是其他类型(如自定义类),返回 null 或创建新实例
return null;
}
}
@SneakyThrows
public static void main(String[] args) {
System.out.println(JSONObject.toJSONString(gen2(Result.class, Role.class)));
}