java - 如何创建属于字符串中指定类的对象?

标签 java string class object

我有一款游戏在与泰拉瑞亚或我的世界等游戏类似的系统上运行,至少在 block 状方面是这样。

我构建它的方式是,每个 block 都是一个对象,并且每种类型的 block 都有一个特定的类(扩展 BlockObject 原型(prototype))。

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

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

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

现在我想让我的游戏动态变化,并且希望这样,如果有人决定创建一个新的 Block 类(修改游戏),他们就不必修改 MapReader 类。因此,与其运行如上所示的一系列 if 语句(每次创建新的 block 类时,必须为该 block 放置一个新的 if 语句),我想要它,以便它创建一个具有的类的新对象与 BlockType 同名。给你一个更好的主意看看下面的内容

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

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

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

最佳答案

您要做的是利用 BlockObject 层次结构中的多态行为。因此使用 class.forName 是一个好方法。在 Class 变量上调用 newInstance() 后,您需要将其转换为 BlockObject 类层次结构的基类(您称之为原型(prototype))。我们可以保证,由于真正的类正在扩展 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);
    }
}

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

关于java - 如何创建属于字符串中指定类的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29528187/

相关文章:

java - java中可以有从0到255的字节吗?

java - 无法解析方法 .getFilter()

string - 如何在 Swift 中删除字符串中的空格?

java - 如何将字符串分成每三个单词(JAVA)

Java:替换多个字符串占位符的最快方法

java - 泛型困惑中的类型删除

java - 为什么我的 equals 方法不起作用?

javascript - Javascript ES6 类中的 'this.name' 可以只是 'name' 吗?

c++ - 如何解析嵌套名称说明符?

java - 创建主方法与静态方法的实例