web-dev-qa-db-ja.com

Javaについて: `String.class`から` String []。class`を取得します。`String.class`が「ランタイム型」の場合はどうなりますか?

これが変数Class<?> cls、別のArray Class Objectどのコンポーネントタイプはclsです。

たとえば、cls = String.class 、 私は手に入れたい String[].class; if cls = int.class、 私は手に入れたい int[].class、 私は何をすべきか?

なるほど、String.class from String[].class

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

しかし、逆を行う簡単な方法を見つけることはできません。

考えられる解決策の1つを次に示します。

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

これを行うための打者の方法はありますか?

31
watchzerg

たぶんClass.forName(String)を試してみてください?

編集:これはコードスニペットです。

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

HRgigerの回答が改善されました。

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

どちらも、呼び出されると配列オブジェクトをインスタンス化します。配列タイプを取得するには、使用します

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

私が見つけた別のトリックは、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