如何在构造函数数组中查找复制构造函数

时间:2012-03-15 19:30:17

标签: java generics reflection abstract-class copy-constructor

我使用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类的子类。我试图找出存储在播放器对象中的武器参考的深拷贝的代码。由于Weapon是抽象的,我无法从中调用复制构造函数。在我的Stick类中,复制构造函数是第三个构造函数,因此我将2硬编码到try语句的构造数组中。如果我通过在复制构造函数前添加新构造函数或重新排序它们来更改stick类的构造函数,如何在运行时找到复制构造函数的位置?

另外,我之前从未使用过Generics,所以,如果我不遵循通常被认为是优秀的编程习惯,请纠正我。

2 个答案:

答案 0 :(得分:5)

如果使用the version of getConstructor that takes arguments,可以通过参数类型指定所需的构造函数。大概你想要传递Stick.class或Weapon.class:

Constructor constructor = myClass.getConstructor(myClass);

答案 1 :(得分:2)

Costructor.getParameterTypes()告诉您构造函数所使用的参数类型。因此,请检查采用正确类型的Object的那个。