示例代码:
int width = 5; int area = 8; int potato = 2; int stackOverflow = -4;
现在,说我想让用户输入一个字符串:
String input = new Scanner(System.in).nextLine();
然后,说出用户输入potato。我将如何检索命名的变量potato并对其进行处理?像这样:
potato
System.getVariable(input); //which will be 2 System.getVariable("stackOverflow"); //should be -4
我抬头看了一些东西,却没发现太多。我确实找到了对“反射API”的引用,但是对于这一简单任务而言,它似乎太复杂了。
有没有办法做到这一点,如果是的话,那是什么?如果“反射”确实有效并且是唯一的方法,那么我将如何使用它来做到这一点?它的教程页面包含了各种我无法理解的内部内容。
编辑:我需要将Strings 保留在变量中以进行我的操作。(我不能使用Map)
Strings
Map
对于你在这里所做的事情,使用反射似乎不是一个好的设计。最好使用Map<String, Integer>例如:
Map<String, Integer>
static final Map<String, Integer> VALUES_BY_NAME; static { final Map<String, Integer> valuesByName = new HashMap<>(); valuesByName.put("width", 5); valuesByName.put("potato", 2); VALUES_BY_NAME = Collections.unmodifiableMap(valuesByName); }
Or with Guava:
static final ImmutableMap<String, Integer> VALUES_BY_NAME = ImmutableMap.of( "width", 5, "potato", 2 );
Or with an enum:
enum NameValuePair { WIDTH("width", 5), POTATO("potato", 2); private final String name; private final int value; private NameValuePair(final String name, final int value) { this.name = name; this.value = value; } public String getName() { return name; } public String getValue() { return value; } static NameValuePair getByName(final String name) { for (final NameValuePair nvp : values()) { if (nvp.getName().equals(name)) { return nvp; } } throw new IllegalArgumentException("Invalid name: " + name); } }