2017-06-09 69 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函數或較重的語言功能來增加重用,似乎對你想要做的事情過度殺傷。