这是一个示例代码,需要获取运行时未知的数组的类名:
//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[]
,我不能将其传递给,m.invoke
因为它需要String[]
。但是,由于我强制用户传递至少一个值,因此我可以使用 的类型values[0]
来构造一个新数组。
我不知道是什么T[].class
。
我想出了上面的代码,它取决于字节码中数组名称的解释,但它安全吗?建议的获取方式是什么T[].class
?