【发布时间】:2012-03-15 19:30:16
【问题描述】:
我正在使用 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 语句中的构造数组中。如果我通过在复制构造函数前面添加一个新的构造函数或重新排序它们来更改棒类的构造函数,我如何在运行时找到复制构造函数的位置?
另外,我以前从未使用过泛型,所以,如果我没有遵循通常被认为是好的编程实践,请纠正我。
【问题讨论】:
-
我不太确定使用反射是个好主意。您可能要考虑将
public abstract Weapon deepCopy()方法添加到您的Weapon类,然后每个子类都必须实现? -
@biziclop 我想我明白为什么你的建议可能是一个更好的主意,但我不知道我将如何实施它。我的播放器类中有一个 Weapon 属性,它包含一个任意子类,例如 Stick。我想编写我的 getter 以便它复制而不是传递引用。会是这样吗?
public Weapon getWeapon() { return weapon.deepCopy(); }
标签: java generics reflection abstract-class copy-constructor