Как найти конструктор копирования в массиве конструкторов - PullRequest
2 голосов
/ 15 марта 2012

Я использую метод getConstructors (), чтобы вытащить конструкторы класса.Класс находится в абстрактной ссылке на суперкласс, и я не буду знать, какой подкласс вызывается, пока пользователь не примет решение.Вот что у меня есть.

Weapon stickCopy = stick;
System.out.println(stick);
System.out.println(stickCopy);

Class <? extends Weapon> myClass = stick.getClass( );

System.out.println(myClass.getSimpleName( ));

Constructor<?>[] construct = myClass.getConstructors( );

for(Constructor<?> constructor: construct)
{
    System.out.println(constructor);
}

try
{
    stickCopy = (Weapon) construct[2].newInstance((stick));
}
catch (Exception e)
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}

System.out.println(stick);
System.out.println(stickCopy);

Класс Stick - это подкласс абстрактного класса Weapon.Я пытаюсь выяснить код для глубокой копии из ссылки на оружие, хранящейся в объекте игрока.Так как Оружие абстрактно, я не могу вызвать конструктор копирования из него.В моем классе Stick конструктор копирования является третьим конструктором, и поэтому я жестко закодировал 2 в массиве конструкций в инструкции try.Если я изменю конструкторы класса stick, скажем, добавив новый конструктор перед конструктором копирования или переупорядочив их, как я могу найти позицию конструктора копирования во время выполнения?

Кроме того, у меня естьникогда раньше не использовал Generics, поэтому, если я не следую тому, что обычно считается хорошей практикой программирования, поправьте меня.

Ответы [ 2 ]

5 голосов
/ 15 марта 2012

Если вы используете версию getConstructor, которая принимает аргументы , вы можете указать нужный конструктор по типам аргументов.Предположительно, вы захотите передать Stick.class или Weapon.class в:

Constructor constructor = myClass.getConstructor(myClass);
2 голосов
/ 15 марта 2012

Costructor.getParameterTypes () сообщает вам типы параметров, которые принимает конструктор.Так что проверяйте тот, который принимает Объект правильного типа.

...