У меня есть класс, который выглядит так:
public class UploadBean {
protected UploadBean(Map<String,?> map){
//do nothing.
}
}
Чтобы использовать отражение и создать объект, вызвав соответствующий конструктор, я написал следующий код:
Class<?> parTypes[] = new Class<?>[1];
parTypes[0] = Map.class;
Constructor ct = format.getMappingBean().getConstructor(parTypes);
Object[] argList = new Object[1];
argList[0] = map;
Object retObj = ct.newInstance(argList);
Этот код завершается с ошибкой во время выполнения с сообщением "Нет такого исключения метода". Теперь, как мне правильно установить тип параметра?! таким образом, чтобы общий аргумент карты в конструкторе был идентифицирован?
Ответ 1 · рейтинг 7 · Jon Skeet
Конструктор защищен - если вы сделаете его общедоступным или используете getDeclaredConstructor вместо getConstructor, он должен работать.
(Вам нужно будет использовать setAccessible, если вы пытаетесь вызвать это откуда-то, к чему у вас обычно нет доступа.)
РЕДАКТИРОВАТЬ: вот тест, чтобы показать, что он работает нормально:
import java.lang.reflect.*;
import java.util.*;
public class UploadBean {
// "throws Exception" just for simplicity. Not nice normally!
public static void main(String[] args) throws Exception {
Class<?> parTypes[] = new Class<?>[1];
parTypes[0] = Map.class;
Constructor ct = UploadBean.class.getDeclaredConstructor(parTypes);
Object[] argList = new Object[1];
argList[0] = null;
Object retObj = ct.newInstance(argList);
}
protected UploadBean(Map<String,?> map){
//do nothing.
}
}
Ответ 2 · рейтинг 1 · fortran
Универсальная информация недоступна во время выполнения, она предназначена только для статического анализа, поэтому делайте это так, как будто дженериков не существует.
Ответ 3 · Rob Di Marco
Я считаю, что вам нужно позвонить
ct.setAccessible(true)
Метод setAccessible позволяет переопределить методы доступа.