[英]Java reflection arrays of List
我正在尝试实现一个 class,它可以将值初始化为任何 class 的 object。 简单结构的初始化已经可以使用,但是我在尝试初始化列表数组( List<String>[]
)时遇到了困难。
有没有办法通过getComponentType()
找出ParameterizedType
而不仅仅是数组的Class
?
数组的创建:
if (cls.isArray()) {
Class<?> c = cls.getComponentType();
if (!c.isPrimitive()) {
Array array = new Array(c, this.sizeArrays);
for (int i = 0; i < this.sizeArrays; i++) {
array.set(i, init(c, c, this.sizeArrays, this.sizeCollection, this.recursionCount, this.values, this.ignoredClass));
}
return array.getArray();
}
Class 阵列:
class Array<E> {
private final E[] objArray;
public final int length;
public Array(
Class<E> dataType,
int length
) {
//noinspection unchecked
this.objArray = (E[]) java.lang.reflect.Array.newInstance(dataType, length);
this.length = length;
}
void set(
int i,
E e
) {
objArray[i] = e;
}
E[] getArray() {
return objArray;
}
}
创建列表:
if (Collection.class.isAssignableFrom(cls)) {
ParameterizedType t = ((ParameterizedType) cls.getGenericSuperclass());
if (type instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) type;
Collection collection;
if (List.class.isAssignableFrom(cls)) {
collection = new ArrayList(this.sizeCollection);
} else if (Set.class.isAssignableFrom(cls)) {
collection = new HashSet(this.sizeCollection);
} else if (Queue.class.isAssignableFrom(cls)) {
collection = new LinkedList();
} else {
collection = new ArrayList(this.sizeCollection);
}
for (int i = 0; i < this.sizeCollection; i++) {
collection.add(init((Class<?>) pt.getActualTypeArguments()[0], pt.getActualTypeArguments()[0], this.sizeArrays, this.sizeCollection, this.recursionCount, this.values, this.ignoredClass));
}
return collection;
}
}
描述List<String>[]
的Type
是GenericArrayType
,而不是ParameterizedType
。
下面的代码将说明这一点。 代码直接转换,因为我们知道字段类型,真正的代码当然会在转换之前使用instanceof
。
List<String>[] x;
public static void main(String[] args) throws Exception {
Field field = Test.class.getDeclaredField("x");
Class<?> fieldType = field.getType();
System.out.println(fieldType); // class [Ljava.util.List;
System.out.println(fieldType.isArray()); // true
System.out.println(fieldType.getComponentType()); // interface java.util.List
GenericArrayType arrayType = (GenericArrayType) field.getGenericType();
ParameterizedType compType = (ParameterizedType) arrayType.getGenericComponentType();
System.out.println(arrayType); // java.util.List<java.lang.String>[]
System.out.println(compType); // java.util.List<java.lang.String>
System.out.println(compType.getRawType()); // interface java.util.List
for (Type argType : compType.getActualTypeArguments())
System.out.println(" " + argType); // class java.lang.String
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.