実行時に不明な配列のクラス名を取得する必要があるコードの例を次に示します。
//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.invoke
String[]
values[0]
何だかわかりませんT[].class
。
バイトコード内の配列名の解釈に依存する上記のコードを思いつきましたが、安全ですか? 取得するための推奨される方法は何T[].class
ですか?