Ниже приведен пример кода, который требует получения имени класса массива, который неизвестен во время выполнения:Каков безопасный способ получить имя класса массива во время выполнения?
//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
?
GetClass() на любой объект будет возвращать его во время выполнения класса, и GetClass() GetName() возвращает класс. имя как строка. Выполнение getClass(). GetName(), за которым следует classForName(), - это просто неэффективный способ сделать getClass(). –
И выполнение 'Class.forName (" [L "+ values [0] .getClass(). GetName() +"; ")' является неэффективным способом делать values.getClass(). –