2010-12-16 1 views
1

Возьмите этот код, например: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() и установить значение свойства, потому что конструктор no-arg защищен.

У меня возникла эта проблема, потому что я пытаюсь написать общий инструмент JPA CRUD. Список/Чтение/Обновление/Удалить в порядке. Но теперь я сталкиваюсь с проблемой, которую я не могу создать в Интернете. Все классы сущностей имеют защищенный конструктор no-arg (поэтому я не могу использовать class.newInstance()) и один открытый конструктор a-lot-of-parameter (но имена параметров стираются во время выполнения).

Как это сделать? Помогает ли javassist или другие методы-посредники? как ? Спасибо большое!

ответ

3

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

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

Вот что JPA будет делать в любом случае, потому что это создает объекты через свой конструктор no-arg.

+0

Ничего себе, спасибо, что сообщили мне, что я могу модифицировать защиту для общественности. Я не знал, что JVM разрешает это раньше. – smallufo 2010-12-16 15:06:42

1

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

User u = new User(null, null); 

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

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

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^