有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使一个对象属于字符串中指定的类?

我有一款运行在类似terraria或minecraft等游戏系统上的游戏,至少在方块方面是如此

我构建它的方式是,每个块都是一个对象,每种类型的块都有一个特定的类(扩展了BlockObject原型)

我让游戏将方块保存在如下文件中

我获取要保存的对象实例的名称,并将其存储在字符串中 我开始将给定对象的信息写入一个具有类名称的字符串中(表示它是什么类型的块,例如BlockGrass.java对象的块将存储为BlockGrass)。 通常,当从保存文件中读取信息时,我正在读取保存文件,当它获取块的信息时,它首先将块类型保存在本地字符串中(本例中为BlockGrass),还保存位置(x cordinate和y cordinate)。然后它将运行一系列if语句,如下所示

if(blockType.equals("BlockGrass"))
{
blocksArray.add(new BlockGrass(...));
}
else if(blockType.equals("BlockStone"))
{
blocksArray.add(new BlockStone(...));
}
etc

现在我想让我的游戏动态变化,这样如果有人决定创建一个新的块类(修改游戏),他们就不必修改MapReader类。因此,我不想像上面那样运行一系列if语句(每次创建一个新的块类时,必须为该块放置一个新的if语句),而是希望它生成一个与块类型同名的类的新对象。为了让你有一个更好的想法,请看以下内容

BlocksArray.add(new blockType(...));

上面显示的内容不起作用的原因是,blockType是一个字符串,其中包含我要使用的类的名称。不是类名

我怎么能做那样的事?,不使用if语句


共 (1) 个答案

  1. # 1 楼答案

    您试图做的是利用BlockObject层次结构中的多态行为。因此,使用class.forName是一种很好的方法。在类变量上调用newInstance()后,需要将其强制转换为BlockObject类层次结构的基类(您称之为原型)。We保证,因为真正的类是扩展BlockObject的,所以根据继承的定义,它是一个BlockObject

    下面是一个例子

    public class GameLoader {
    
        private List<BlockObject> blocksArray = new ArrayList<BlockObject>();
    
        public Object getNewBlock(String blockClassName) throws     ClassNotFoundException, InstantiationException, IllegalAccessException {
    
            Class blockClass = Class.forName(blockClassName);
            return blockClass.newInstance();
    
        }
    
        public void addNewBlockType(String typeName) throws     ClassNotFoundException, InstantiationException, IllegalAccessException {
    
            BlockObject castedType = (BlockObject)getNewBlock(typeName); 
            blocksArray.add(castedType);
        }
    }
    

    在此类对象上调用的基类的任何方法都将显示多态行为