从对象实例中实例化对象

时间:2015-01-05 08:39:21

标签: java reflection instantiation

我正在创建一个游戏,其中角色可以附加模块,这些模块提供额外的功能,例如可能有一个银行家'模块,用于侦听点击事件并打开银行菜单。通过扩展Module类并使用ModuleFactory注册实例,模块可由用户创建。模块能够自行序列化,并在构造函数中传递时从序列化形式(保存为XML)加载自身。

我遇到的问题是,在加载模块时,我有每个模块的名称和实例,但我不能为每个模块创建一个新实例。

在每个返回模块实例的模块中创建一个newInstance()方法是否可以接受? 我知道可以使用反射,但大多数时候我发现反射比我从中获得的好处更麻烦。

4 个答案:

答案 0 :(得分:3)

可以做这样的事情,因为你说你已经知道每个Module的名字(希望在某种列表中)。

Class<?> temp = Class.forName("ModuleName");
Object obj = temp.newInstance();

这实际上是反思。


最初我有这个,但我的上面的代码是优越的,因为这将要求你有一个方法,在每个Module内创建一个新的实例。它有效,但它很混乱。可以把它想象成一个创造自身克隆的对象,这很奇怪。

public static Module createInstance()
{
    return new ThisModule();
}

答案 1 :(得分:0)

如果您希望将新实例作为现有实例的副本,则可以使用clone方法, 否则,创建一个为您创建实例的工厂方法,

public static Module createInstance(){
   return new Module();
}

我不确定我是否完全理解你想要的东西

答案 2 :(得分:0)

在每个模块中创建一个静态方法来实例化。这是静态工厂方法。有效的java书说,通过静态工厂方法创建对象确实是一种好习惯。

我认为我们可以在对象上调用静态方法(虽然不是一个好习惯)。

答案 3 :(得分:0)

如果我理解正确,您希望扩展对象的行为,并能够通过XML将其发送/序列化到客户端并返回(前端&lt; - &gt;后端通信)。

我认为你所寻找的东西就像是你的模块和子模块的装饰。也许你应该将它们构建为彼此可装饰的,就像InputStream一样。

类似的东西:

MyBaseModule base = new MyBaseModule();
BankerModule banker = new BankerModule(base);
ExtendedBankerModuler extBanker = new ExtendedBankerModule(banker);

也许调用extBanker.toXML()来获取XML以将其发送到前端。 你可以用装饰品的标签包装每个模块......

<serialized>
    <module>
        <type>ExtendedBankerModule</type>
        <description>extended banker module</description>
        <decorates>
            <module>
                <type>BankerModule</type>
                <description>banker module</description>
                <decorates>
                    <module>
                        <type>MyBaseModule</type>
                        <description>basic module</description>
                        <decorates></decorates>
                    </module>
                </decorates>
            </module>
        <decorates>
    </module>
</serialized>