Я хотел бы создать экземпляр указанного класса, используя его имя. Мой код показан ниже.Generics и Class.forName
Я получаю предупреждение о компиляторе. Правильно ли я делаю это? Возможно ли даже использовать имя класса и вернуть экземпляр этого типа, поскольку я не думаю, что какой-либо способ компилятора узнать, какой тип должен быть?
public static <T> T create(final String className) {
try {
final Class<?> clazz = Class.forName(className);
//WARNING: Type safety: Unchecked cast from capture#2-of ? to T
return (T) create(clazz);
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static <T> T create(final Class<T> classToCreate) {
final Constructor<T> constructor;
try {
constructor = classToCreate.getDeclaredConstructor();
final T result = constructor.newInstance();
return result;
}
catch (Exception e) {
e.printStackTrace();
}
}
Благодаря
Да, это так близко, вы можете получить с Java. Что касается создания фактического объекта, есть еще несколько трюков, которые нужно сделать, но я не собираюсь вникать в специфику, поскольку эти трюки реализованы в моем классе утилиты. Я планирую выпустить, как только я узнаю канал для распространения среди всех Java-программистов. – Esko
@ Esko, рассмотрите код Google (для выпущенных версий) и/или с Github (для фактического кода) –
Вам нужно добавить бросок, чтобы он скомпилировал 'final Class clazz = (класс ) Class.forName (className). asSubclass (ifaceClass); ' –