反射初始化泛型类

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)));
    }
posted @ 2025-04-19 01:07  itwetouch  阅读(9)  评论(0)    收藏  举报