动态创建公共变量Java

时间:2014-03-10 15:46:18

标签: java

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

public static final Tile <TILE_NAME> = new BasicTile<BasicSolidTile>(id, SpriteSheetX, SpriteSheetY, 0xFFColorInMap, isBackground, isLiquid);

这个游戏的一个主要方面是能够随意“修改”它(将有一个mod.smf文件,其中包含modding声明)。在此文件中,您将创建一个新的Tile,如下所示:

--Tile--
BasicTile/BasicSolidTile <Name>: X,Y,HexColor,<Background/Foreground>,<NotLiquid/Liquid>

ID将在代码中计算。

我想知道如何在我的Tile类中使用for循环运行mod文件中的所有新Tiles来创建更多“public static final Tile”。是否可能,或者我是否必须更改Tile的存储方式(例如ArrayList?)?

3 个答案:

答案 0 :(得分:2)

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

您需要使用集合。就像你说的那样,ArrayList是众多选择之一。

答案 1 :(得分:2)

你的任务是不可能的。

您不能通过代码在运行时向类中添加任何字段。

而不是这个请求,你必须将你的解决方案更改为将你的Tiles带来的东西。

几乎可以是任何类型的集合。您必须分析什么是最佳用法并决定进一步使用的内容。

祝你好运。

答案 2 :(得分:2)

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

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

  • 要只有一个(修改过的)课程副本,您可以实施Java-Agent。使用Java-Agent,您可以在加载到Java Virtual Maschine之前修改字节代码。 ASM使这项任务相对容易。

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

  • 最麻烦的解决方案是改变类的字节代码,然后使用调试模式将其重新加载到您自己的JDK中。我不会建议实际使用它。您可以获得有关此方法的更多信息,以探索流行模拟库的源代码 JMockit。