1

実行時に不明な配列のクラス名を取得する必要があるコードの例を次に示します。

//for calling methods declared similar to
//  void method(String... values);
//For primitive type we have other overloads and the following 
//is generic for classes 

@SuppressWarnings("unchecked")
private static <T> void invokeVaridic(Method m, Object host, T... values) 
    throws IllegalAccessException, IllegalArgumentException, 
    InvocationTargetException, ClassNotFoundException{

    assert(values.length>0); //We assume all users passes at least one value
    Class<? extends T[]> c = (Class<? extends T[]>) 
            Class.forName("[L" + values[0].getClass().getName() + ";");
    m.invoke(host, Arrays.copyOf(values, values.length,c));
}

の型valuesは実際には型消去性があるので、 が必要なのでObject[]渡すことができません。ただし、ユーザーに少なくとも 1 つの値を渡すように強制しているので、型を使用して新しい配列を作成できます。m.invokeString[]values[0]

何だかわかりませんT[].class

バイトコード内の配列名の解釈に依存する上記のコードを思いつきましたが、安全ですか? 取得するための推奨される方法は何T[].classですか?

4

2 に答える 2

4

valuesタイプはT[]:

Class<? extends T[]> arrayType = (Class<? extends T[]>) values.getClass();
Class<? extends T> component = (Class<? extends T>) values.getClass().getComponent();

/編集

完全な例:

public class GenericArray {
    public static void main(String[] args) {
        foo("", "");
    }

    @SafeVarargs
    public static <T> void foo(T... args) {
        Class<? extends T[]> array = (Class<? extends T[]>) args.getClass();
        Class<? extends T> component = (Class<? extends T>) array.getComponentType();
        System.out.println(array);
        System.out.println(component);
    }
}

JDK 1.7.0_25 で以下を出力します

class [Ljava.lang.String;
class java.lang.String
于 2013-07-31T06:05:39.853 に答える