Constructor.newInstance(), не зная последовательность параметров?

Возьмите этот код для примера:

public class User {
  private String username;
  private String password;

  protected User()
  {}

  public User(String username , String password)
  {...}

  //getters & setters
}

Мы можем использовать User.class.getConstructors() и найти там 2 конструкторов, и с constructor.getParameterTypes() мы можем определить, что есть один конструктор с двумя параметрами String. Мы также можем использовать отражение, чтобы найти два свойства: имя пользователя и пароль. Но во время выполнения мы не знаем правильную последовательность двух параметров, используемых для вызова constructor.newInstance (?,?).

constructor.newInstance(username , password), а также constructor.newInstance(password , username) оба законны, но с совершенно другим результатом.

Я не могу использовать User.class.newInstance() и установите значение свойства, потому что конструктор без аргументов защищен.

Я сталкиваюсь с этой проблемой, потому что я пытаюсь написать универсальный инструмент JPA CRUD. Список / Читать / Обновить / Удалить в порядке. Но теперь я сталкиваюсь с проблемой, что я не могу онлайн создать объект. Все классы сущностей имеют защищенный конструктор без аргументов (поэтому я не могу использовать class.newInstance()) и один открытый конструктор с множеством параметров (но имена параметров стираются во время выполнения).

Как это сделать? Javassist или другие прокси-техники помогают? как? Большое спасибо!

3 ответа

Решение

Ты можешь использовать:

Constructor<?> c = class.getDeclaredConstructor();
c.setAccessible(true);
c.newInstance();

Это то, что JPA будет делать в любом случае, потому что она создает объекты через конструктор без аргументов.

Это может быть просто обходной путь, но вы не можете создать пользователя с помощью (я опускаю отражение для удобства чтения)

User u = new User(null, null);

а затем установить свойства в вашем инструменте?

u.setUsername(...);
u.setPassword(...);

Вы можете генерировать более или менее атомарный код, чтобы он не имел значения для вас.

Порядок будет таким же во время выполнения, так почему бы просто не определить правильный порядок и не рассматривать его как таковой.

Другие вопросы по тегам