繁体   English   中英

列表的 Java 反射 arrays

[英]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>[]TypeGenericArrayType ,而不是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM