Java加载XML未知类类型

Java加载XML未知类类型,java,xml,libgdx,Java,Xml,Libgdx,我目前正在业余时间用Java开发一个马里奥式的平台成型器,作为一种尝试我在这方面没有经验的概念的方法。其中之一是在XML文件中加载和存储信息,以便最终用户或编辑工具在理论上可以修改游戏,而无需源代码/重新编译游戏 到目前为止,我自己已经相当成功,但我完全不确定如何进步。我正在尝试从XML文件加载将在某个级别上找到的实体。XML文件当前包含其他信息,如地图位置和播放器生成点,使用w3c文档对象模型可以正确工作 我的困难来自这样一个事实:我需要从文件中加载多种类型的实体(特殊块、怪物等),我真的不希

我目前正在业余时间用Java开发一个马里奥式的平台成型器,作为一种尝试我在这方面没有经验的概念的方法。其中之一是在XML文件中加载和存储信息,以便最终用户或编辑工具在理论上可以修改游戏,而无需源代码/重新编译游戏

到目前为止,我自己已经相当成功,但我完全不确定如何进步。我正在尝试从XML文件加载将在某个级别上找到的实体。XML文件当前包含其他信息,如地图位置和播放器生成点,使用w3c文档对象模型可以正确工作

我的困难来自这样一个事实:我需要从文件中加载多种类型的实体(特殊块、怪物等),我真的不希望每次都在我的loader方法中硬编码,以便在添加新类时,例如Monster3.java,我只需在XML文件中添加几行代码,就可以在不编辑加载程序方法的情况下创建Monster3

以下是我的级别文件的当前格式:

<level>
    <map>data\level2.tmx</map>

    <player file="data\player.xml">
        <x>0</x>
        <y>48</y>
    </player>

    <entities>
        <entity type="monster1" file="data\monster1.xml">
            <x>48</x>
            <y>48</y>
        </entity>

        <entity type="monster1" file="data\monster.xml">
            <x>96</x>
            <y>48</y>
        </entity>    
    </entities>
</level> 

数据\level2.tmx
0
48
48
48
96
48

只需要一些背景信息,所有的怪物都扩展了一个中心实体类。它们都有自己的构造函数来为使用相同参数(表示文件位置的字符串和带起始位置的向量2)调用super的怪物类型设置细节。我不希望被交给代码,我只希望被推到正确的方向。

你在这里寻找的是'Reflection'

//Fully qualified name
String typeName = "com.yourcompany.product.Monster3";

try {
    //Class from name
    Class<?> myClass = Class.forName(typeName);

    //Constructor from Parameter types...
    Class<?>[] types = {Double.TYPE, String.class};
    Constructor constructor = myClass.getConstructor(types);

    //Instance from Parameter values...
    Object[] parameters = {new Double(0), "Hello"};
    Object instanceOfMyClass = constructor.newInstance(parameters);

} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
    ex.printStackTrace();
}
//完全限定名
字符串typeName=“com.yourcompany.product.3”;
试一试{
//从名称初始化
Class myClass=Class.forName(typeName);
//来自参数类型的构造函数。。。
类[]类型={Double.TYPE,String.Class};
构造函数=myClass.getConstructor(类型);
//参数值中的实例。。。
Object[]参数={new Double(0),“Hello”};
Object instanceOfMyClass=constructor.newInstance(参数);
}catch(ClassNotFoundException | NoSuchMethodException | SecurityException |实例化Exception | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex){
例如printStackTrace();
}
注意
这里的一个重要问题是类型安全。
当您的软件变大时,调试将变得越来越困难。
因此,我建议使用抽象工厂模式,我认为它适合您的用例。
此外,明智的做法是花时间实现类型安全的抽象工厂(当然使用泛型),以使以后的工作更轻松


希望这有助于

Monster1
Monster2
Monster3
等。这些都是不同的类吗?为什么?我不希望每个实体都有相同的行为。实体类用于任何动态对象,如硬币或特殊块。我知道可能需要
硬币
类和
怪物
类。我不明白的是,为什么每个
怪物
都需要自己的类,为什么它们不能使用相同的
怪物
类。它们是不同类型的怪物,我不是对每个实例都使用不同的类,但每种类型都有特定的行为。例如,怪物1可能只是随机游荡,而怪物2可能专门寻找玩家。(这些都只是假设和简化的例子。)@nhgrif
Bird
怪物和
Kitty
怪物本质上是不同的怪物,而不仅仅是名字。你可以有一个通用的
Monster
类和子类
Bird
Kitty
但是我可能仍然会将它们存储为
Bird
Kitty
对象。