2017-06-09 42 views
0

所以我有一个机器人可以作为角色扮演游戏者的战斗,技能点等,我试图让我的代码更通用一些,所以我可以减少页面数量,因为他们全部做同样的事情,他们只是有不同的initilizers但我遇到了一个障碍,我需要检查用户是否有特定统计力量,感知,敏捷最低等动态命名的SQL字段

,所以我打电话

mainSPECIAL = rows[0].Strength; 

这是蹭,天气它的力量,pericpetion,智力,运气,无论我总是要检查行[0] .that属性,即行[0]。劳克为运气福利,我也是伊迪先前设置在我initilizers

var PERKSPECIALName = "Strength"; 

但我不能叫

mainSPECIAL =行[0] .PERKSPECIALName但应该有办法做到这一点吗?所以当它看到“行[0] .PERKSPECIALName”它查找“PERKSPECIALName”,然后取行的值[0] .Strength

回答

0

为此,你需要使用反射:

Field f1 = rows[0].getClass().getField(PERKSPECIALName); 

Integer attribute = (Integer) f1.get(rows[0]); 

其中“Integer”是你从物体上拉出的元素的类型(强度的类型)

该字段必须声明为public!我认为有一种方法可以在不公开它们时获得它们,但它需要更多的代码。

+0

似乎没有工作我刚刚得到和错误Filed f1“F1是不是一个有效的标识符” 'Field f1 = rows [0] .getClass()。getField(PERKSPECIALName); mainSPECIAL = rows [0] .f1;' – NekoLLX

+0

f1是一个Field实例,没有别的。你必须解析它到你的类型。我会将此添加到解决方案中。 –

0

好像你有一组整数,你需要用一个常量标识符来识别。你可能会发现EnumMap很有用。看看How to use enumMap in java

或者如果您只想使用字符串来确定您想引用哪个perk,只需使用Map即可。

Java不像其他语言一样引用成员,因此如果您不想更改数据结构,那么您正在考虑使用lambda函数或较重的语言功能来增加重用,似乎对你想要做的事情过度杀伤。