【问题标题】:How to find copy constructor in constructor array如何在构造函数数组中找到复​​制构造函数
【发布时间】: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


【解决方案1】:

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

Constructor constructor = myClass.getConstructor(myClass);

【讨论】:

  • 参数必须是数组,IIRC,否则是最干净的解决方案。
  • @Jochen 现在是可变参数,快乐的日子。
  • 我确实有一个后续问题。如果我确保武器不为空,是否会出现围绕您的代码的 try-catch 语句实际上会引发错误的情况?我正在尝试决定是应该使用 try/catch 还是将其传递到堆栈中。
  • @Gilbrithor,请注意,虽然这是识别“复制构造函数”签名的好方法,但这并不能真正保证所谓的复制构造函数实际上执行深度复制。
  • @Gilbrilthor 没错。即使你正在写所有东西,在实践中你也会犯错误。通常发生的情况是您添加了一个新字段,但忘记在复制构造函数中添加一行来复制该字段。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 2016-09-12
    • 2018-09-23
    • 2013-02-22
    相关资源
    最近更新 更多