Java:如何重建未知类

时间:2014-09-15 01:29:46

标签: java inheritance polymorphism

我有一个实例化一个通用对象的类,该对象可以是特定类的任何一个子类:

abstract class Sport;
class Basketball extends Sport {
    Basketball (Team teamA, Team teamB) { /*set sport rules*/ }
}
class Soccer extends Sport {
    Soccer (Team teamA, Team teamB) { /*set sport rules*/ }
}

class Match {
    Sport s;

    Match (Sport y) { this.s = y; }

    void playMatch ();
}

我希望能够通过调用其构造函数来重置方法中的对象:

void playMatch () {
    this.s = new /*class of s*/();
    /*do stuff with s*/
}

我该怎么做?

1 个答案:

答案 0 :(得分:1)

如果您知道 s 构造函数没有参数,则可以调用:

s.getClass().newInstance()

否则,如果你知道它的构造函数的参数,

Constructor ctor = s.getClass().getConstructor(TypeA.class, TypeB.class, etc...);
S sInstance = (S)ctor.newInstance(typeAValue, typeBValue, etc...Value);

否则,您可以使用Objenesis,它可以生成您需要的任何类,但请注意,通过使用该方法,您可以在不调用任何构造函数的情况下获取对象,这可能很危险。你必须告诉objenesis手动调用你的构造函数,但是你必须知道它需要的参数。


但我不了解你的代码......是java还是伪代码?


既然您发布了一些真实的代码,我真的不建议您使用这个答案。事实上,这是你可以从未知类中实现对象的方式,但在你的情况下,你不应该这样做。

我建议您在reset()课程中添加Sport方法。 使用反射实现对象是危险的;如果构造函数参数发生更改,则在编译时不会注意到。它在运行时也很慢,虽然现在这不是一件大事......除非你每秒拨打1000次。

它还可让您稍后实施Observer pattern,以便您可以关注体育的状态。还有很多其他东西会妨碍你做...

你真的不应该这样做。