所以我已经在互联网上寻找修复,我已经获得了使用地图,反射方法和其他许多东西的提示,但没有任何方法按照我想要的方式工作。
我的目标是做这样的事情:
我有一个分为数组的字符串。示例:“setVal strength 3”
lineArray [0] = setVal
lineArray [1] =力量
lineArray [2] = 3
我想接受lineArray [1]并添加“Feats”。在它的开头,所以它,例如,像“Feats.strength”(我可以用字符串变量做)
然后我想将该变量(Feats.strength,它是Feats类中的一个名为strength的双精度)设置为lineArray [2](这是一个双精度)。
else if(lineArray[0].equals("setVal") && lineArray.length == 2){
//Take lineArray[1], which is the name of a variable in
another class, specifically Feats.strength, Feats.agility, etc.
//Set that value in lineArray[1] to lineArray[2]
//Something like
set("Feats." + lineArray[1], lineArray[2]);
Feats.resetStat();
}
这有什么意义吗?感谢您的帮助!
答案 0 :(得分:0)
也许这样的事情可行吗?
// Application.java
public class Application {
public static void main(String[] args){
String field = "setVal strength 3";
Feats.resolveValue(field);
String field2 = "getVal strength";
Integer value = Feats.resolveValue(field2);
String field3 = "clearAll";
Feats.resolveValue(field3);
}
}
-
// Feats.java
public class Feats {
private static final Logger LOGGER = LoggerFactory.getLogger(Feats.class);
private static final Map<String, Integer> ATTRIBUTES = new HashMap<>();
public static String resolveString(String fieldInput){
String response = null;
String[] values = fieldInput.split(" ");
Action action;
try {
action = Action.valueOf(values[0].trim().toUppercase());
} catch(Exception e){
LOGGER.error("Not a valid Action in input: " + fieldInput);
return response;
}
switch(action){
case SETVALUE:
setValue(values[1].trim(), values[2].trim());
break;
case CLEARALL:
clearAll();
break;
case GETVALUE:
response = getValue(values[1].trim());
break;
default:
assert true;
}
return response;
}
private static void setValue(String attrName, String attrValue){
ATTRIBUTES.put(attrName, attrValue);
}
private static String getValue(String attrName){
return ATTRIBUTES.get(attrName);
}
private static void clearAll(){
ATTRIBUTES.clear();
}
}
-
// Action.java
public enum Action {
SETVALUE, CLEARALL, GETVALUE
}
答案 1 :(得分:0)
所以我解决了。感谢@shmosel告诉我使用字段。
long temp = Long.parseLong(lineArray[2]);
try {
Feats.class.getField(lineArray[1]).set(lineArray[1], temp);;
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e1) {
e1.printStackTrace();
}