动态创建一个公共变量Java

动态创建一个公共变量Java,java,Java,我现在正在做一个游戏。在这个游戏中,有一个名为“Tile”的类,它有一个以这种格式列出所有Tile的列表: public static final Tile <TILE_NAME> = new BasicTile<BasicSolidTile>(id, SpriteSheetX, SpriteSheetY, 0xFFColorInMap, isBackground, isLiquid); public static final Tile=new BasicTile(id

我现在正在做一个游戏。在这个游戏中,有一个名为“Tile”的类,它有一个以这种格式列出所有Tile的列表:

public static final Tile <TILE_NAME> = new BasicTile<BasicSolidTile>(id, SpriteSheetX, SpriteSheetY, 0xFFColorInMap, isBackground, isLiquid);
public static final Tile=new BasicTile(id,SpriteSheetX,SpriteSheetY,0xffcolornmap,isBackground,isLiquid);
这个游戏的一个主要方面是能够随意“修改”它(将有一个mod.smf文件,其中包含修改声明)。在此文件中,您将创建一个新的平铺,如下所示:

--Tile--
BasicTile/BasicSolidTile <Name>: X,Y,HexColor,<Background/Foreground>,<NotLiquid/Liquid>
--平铺--
碱性/碱性固体文件:X,Y,六色,,
ID将在代码中计算


我想知道如何在我的Tile类中创建更多的“公共静态最终Tile”,使用一个for循环遍历mod文件中的所有新Tile。是否可能,或者我是否必须更改磁贴的存储方式(例如ArrayList?)

您不能在运行时以编程方式更改类的定义。例如,不能添加静态字段


你需要使用一个集合。正如您所说,
ArrayList
是众多选项之一。

您的任务是不可能完成的

您的代码不能在运行时将任何字段添加到类中

而不是这个要求,你必须改变你的解决方案,什么东西将采取你的瓷砖

这几乎可以是任何类型的集合。你必须分析什么是最好的用途,并决定进一步使用什么


祝你好运。

ArrayList将是最佳选择。但以防万一:以下是一些可能性,您可以如何动态添加字段(或者在运行时更改现有类):

  • 您可以从类加载器获取类的字节码,然后使用-libaray修改类。修改后的字节码可以使用自定义类加载器加载到JVM中。之后,您将同时加载类的两个不同副本。要在修改的类而不是原始类上调用方法,必须使用

  • 只有一个(修改过的)类副本可以实现。使用Java代理,您可以在加载到Java虚拟机之前修改字节码。使这项任务相对容易

  • 您还可以从mod文件生成Java代码,对其进行编译,然后将其加载到JVM中。为了在运行时使用
    javac
    编译Java代码,您需要JDK。但是大多数普通的应用程序只安装了JRE。一个很好的选择是使用。它支持内存编译,您可以将java代码转换为字节码,而无需在磁盘上创建任何文件

  • 最乏味的解决方案是更改类的字节码,然后使用调试模式将其重新加载到自己的JDK中。我不建议你真的这么做。您可以通过探索流行的mocking库的源代码,获得有关这种方法的更多信息 杰莫基特

这是可能的(见我的答案)。但是对于这个特定的用例,我甚至不会去想它:-)