web-dev-qa-db-fra.com

à propos de Java: récupérez `String []. class` dans` String.class`, que faire si `String.class` est un" type d'exécution "?

Voici une variable Class<?> cls, maintenant je veux obtenir un autre Array Class Object dont le type de composant est cls.

Par exemple, si cls = String.class , Je veux obtenir String[].class; si cls = int.class, Je veux obtenir int[].class, que devrais-je faire?

Vous voyez, il est assez facile d'obtenir String.class de String[].class:

Class<?> arrayCls = String[].class;
if(arrayCls.isArray()){
    Class<?> cls = arrayCls.getComponentType();
}

Mais je ne trouve pas de moyen facile de faire l'inverse.

Voici une solution possible:

Class<?> clazz = String.class;
Class<?> arrayClass = Array.newInstance(clazz,0).getClass();

Y a-t-il un moyen simple de le faire s'il vous plaît?

31
watchzerg

Essayez peut-être Class.forName(String)?

Edit: Voici un extrait de code.

Class<?> arrayClass = String[].class;
System.out.println(arrayClass);
Class<?> namedClass = Class.forName("[L" + String.class.getName() + ";");
System.out.println(namedClass);
System.out.println(arrayClass == namedClass);
9
zienkikk

La réponse de HRgiger s'est améliorée:

@SuppressWarnings("unchecked")
static <T> Class<? extends T[]> getArrayClass(Class<T> clazz) {
    return (Class<? extends T[]>) Array.newInstance(clazz, 0).getClass();
}

Les deux instancient un objet tableau lorsqu'il est appelé. Pour obtenir le type de tableau, utilisez

Class<?> childType = ...;
Class<?> arrayType = getArrayClass(childType);
15
Limeth

Une autre astuce que j'ai trouvée consiste à utiliser des varargs sur la méthode util.

public static void main(String[] args) throws ClassNotFoundException {

    Class<?> demo = Main.<String>getArrayClass();
    System.out.println(demo);
}

static <T> Class getArrayClass(T... param){
    return param.getClass();
}
10
HRgiger