Создание объекта Java из имени класса с помощью конструктора, который содержит параметры
Я хочу создать объект класса из имени, конструктора вызовов и создать новый экземпляр. Но я не знаю, как отправлять параметры конструктору. Мой базовый класс:
public carDao(ConnectionSource connectionSource, Class<Car> dataClass) throws SQLException
{
super(connectionSource, dataClass);
}
и что я хочу делать:
Class myClass = Class.forName("carDao");
Constructor intConstructor= myClass.getConstructor();
Object o = intConstructor.newInstance();
что я должен писать в getConstructor()?
Ответы
Ответ 1
Вам нужно передать классы для своего конструктора
Например, если ваш конструктор имеет параметр String
Class myClass = Class.forName("carDao");
Constructor<?> cons = myClass.getConstructor(String.class);
Object o = cons.newInstance("MyString");
В вашем случае это будет:
myClass.getConstructor(ConnectionSource.class, Class.class);
Так как декларация метода getConstructor такова:
//@param parameterTypes the parameter array
public Constructor<T> getConstructor(Class<?>... parameterTypes)
throws NoSuchMethodException, SecurityException {
Ответ 2
Это должно работать:
public static <T> T newInstance(final String className,final Object... args)
throws ClassNotFoundException,
NoSuchMethodException,
InstantiationException,
IllegalAccessException,
IllegalArgumentException,
InvocationTargetException {
// Derive the parameter types from the parameters themselves.
Class[] types = new Class[args.length];
for ( int i = 0; i < types.length; i++ ) {
types[i] = args[i].getClass();
}
return (T) Class.forName(className).getConstructor(types).newInstance(args);
}
Ответ 3
Вам нужно передать типы или аргументы в getConstructor
, чтобы получить правильный конструктор. Попробуйте, может быть,
myClass.getConstructor(ConnectionSource.class,Class.class);
и
intConstructor.newInstance(connectionSourceInstance, classInstance);
Ответ 4
Вы должны предоставить Class
объекты getConstructor
, например:
Class myClass = Class.forName("carDao");
Constructor intConstructor= myClass.getConstructor(ConnectionSource.class, Class.class);
Object o = intConstructor.newInstance(connectionSource, dataClass);
Для получения дополнительной информации см. документацию метода getConstructor
:
public Constructor<T> getConstructor(Class<?>... parameterTypes)
throws NoSuchMethodException,
SecurityException