创建 Collection 类型 Class<T>

Create Collection of type Class<T>

我正在尝试编写一个给定 class 的函数,它将构建该类型的 object(使用反射)。到目前为止它的工作,但我在使用 Collections 作为成员时遇到了问题。

public static <T> T object(Class<T> type) throws NoSuchMethodException, ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException {

            T object = getNullInstanceOf(type);

            List<Field> fields = Arrays.asList(object.getClass().getDeclaredFields());

            for (Field f : fields) {
                f.setAccessible(true);
                if (Modifier.isFinal(f.getModifiers())) {
                    continue;
                }
                try {
                    Object fieldValue = f.get(object);
                    if (f.getType().equals(CharSequence.class) || f.getType().equals(String.class)) {
                        f.set(object, f.getName());
                    } else if (f.getType().equals(Integer.TYPE)) {
                        f.set(object, 1);
                    } else if (f.getType().equals(Double.TYPE)) {
                        f.set(object, 2.0);
                    } else if (f.getType().equals(Long.TYPE)) {
                        f.set(object, 3L);
                    } else if (isClassCollection(f.getType())) {
                        f.set(object,
                                ((Collection) getNullInstanceOf(f.getType())) // this throws a "No Such Method Exists" Exception
                                    .add(object(f.getGenericType().getClass()))); 
                    } else if (!(f.getType().equals(type))) {
                        f.set(object, object(f.getType()));
                    } else {
                        return null;
                    }
                } catch (Exception e) {
                    System.err.println("Could not access:" + f.getName());
                    continue;
                }
            }
            return object;
        }

        public static boolean isClassCollection(Class<?> c) {
            return Collection.class.isAssignableFrom(c)
                    || Map.class.isAssignableFrom(c);
        }

        private static <T> T getNullInstanceOf(Class<T> type) throws InvocationTargetException, InstantiationException,
                IllegalAccessException, NoSuchMethodException, ClassNotFoundException {
            Class<?> clazz = Class.forName(type.getName());
            Constructor<?> ctor = clazz.getConstructor();
            return (T) ctor.newInstance();
        }
    }

我遇到的问题是,当我尝试创建 Collection 的实例时,无论它是 SetList 还是 Map ,那些 classes 是抽象的。有没有办法只选择一个随机实现,或者我必须为每个抽象 class 硬编码一个具体的 subclass?

从问题来看,您似乎可以接受任何随机实施。如果 也包含 EMPTY IMMUTABLE 实现 ,那么您可以使用 static 方法 of,它在 MapListSet.

(请注意,在 isClassCollection 中,您正在检查 MapCollection,然后在当前代码中,您将结果转换为 Collection。这当输入类型是 Map 时会失败。这是因为 Map 不是 Collection)

public static boolean isClassCollection(Class<?> c) {
    return Collection.class.isAssignableFrom(c) || Map.class.isAssignableFrom(c);;
}

现在,主要的改变是在您的 getNullInstanceOf

中完成
private static <T> T getNullInstanceOf(Class<T> type) throws Exception {
    if(isClassCollection(clazz)) {
        return (T) clazz.getMethod("of").invoke(null);
    }
       
    Class<?> clazz = Class.forName(type.getName());
    Constructor<?> ctor = clazz.getConstructor();
    return (T) ctor.newInstance();
}

现在,稍微改变 object 方法中的 if 条件为:

else if (isClassCollection(f.getType())) {
    f.set(object, getNullInstanceOf(f.getType())); 
}