Создание объекта 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