2012-03-15 110 views
2

我正在使用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类中,拷贝构造函数是第三个构造函数,所以我在try语句中将2硬编码到构造数组中。如果我通过在拷贝构造函数前面添加一个新的构造函数或对它们进行重新排序来更改该类的构造函数,如何在运行时找到拷贝构造函数的位置?

此外,我从来没有使用过泛型,所以,如果我没有遵循什么通常被认为是好的编程实践,请纠正我。

+4

我不太清楚使用反射这是一个好主意。你可能想考虑在你的'Weapon'类中添加一个'public abstract Weapon deepCopy()'方法,然后每个子类必须实现? – biziclop 2012-03-15 20:04:56

+0

@biziclop 我想我明白为什么你的建议可能是一个更好的主意,但我不知道我会如何实现它。我的玩家类中有一个Weapon属性,它拥有一个任意的子类,比如Stick。我想写我的getter,以便它做一个副本,而不是传出参考。会是这样吗? 'public Weapon getWeapon(){return weapon.deepCopy(); }' – Gilbrilthor 2012-03-15 20:44:05

+0

是的,这就是我的意思。 – biziclop 2012-03-15 20:55:10

回答

5

如果您使用the version of getConstructor that takes arguments,则可以通过参数类型指定所需的构造函数。想必你会想通过其中Stick.class或Weapon.class在:

Constructor constructor = myClass.getConstructor(myClass); 
+1

参数必须是数组IIRC,否则是最干净的解决方案。 – Jochen 2012-03-15 20:08:22

+0

@Jochen现在是可变参数,快乐的日子。 – biziclop 2012-03-15 20:13:24

+0

非常感谢。你给了我一个很好的答案! – Gilbrilthor 2012-03-15 20:16:21

2

Costructor.getParameterTypes()告诉你的类型的构造函数采用的参数。因此请检查是否有正确类型的对象。