创建 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
的实例时,无论它是 Set
、List
还是 Map
,那些 classes 是抽象的。有没有办法只选择一个随机实现,或者我必须为每个抽象 class 硬编码一个具体的 subclass?
从问题来看,您似乎可以接受任何随机实施。如果 也包含 EMPTY IMMUTABLE 实现 ,那么您可以使用 static
方法 of
,它在 Map
、List
和 Set
.
(请注意,在 isClassCollection
中,您正在检查 Map
和 Collection
,然后在当前代码中,您将结果转换为 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()));
}
我正在尝试编写一个给定 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
的实例时,无论它是 Set
、List
还是 Map
,那些 classes 是抽象的。有没有办法只选择一个随机实现,或者我必须为每个抽象 class 硬编码一个具体的 subclass?
从问题来看,您似乎可以接受任何随机实施。如果 也包含 EMPTY IMMUTABLE 实现 ,那么您可以使用 static
方法 of
,它在 Map
、List
和 Set
.
(请注意,在 isClassCollection
中,您正在检查 Map
和 Collection
,然后在当前代码中,您将结果转换为 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()));
}