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(...);
Вы можете генерировать более или менее атомарный код, чтобы он не имел значения для вас.
Порядок будет таким же во время выполнения, так почему бы просто не определить правильный порядок и не рассматривать его как таковой.