Constructor.newInstance (), не зная последовательности параметров? - PullRequest
1 голос
/ 16 декабря 2010

Возьмите этот код, например:

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 ]

3 голосов
/ 16 декабря 2010

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

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

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

1 голос
/ 16 декабря 2010

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

User u = new User(null, null);

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

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

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

0 голосов
/ 16 декабря 2010

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

...