我有普通的String变量:
public static String dog = "Bulldog";
public static String cat = "Birman";
public static String mouse = "Logitech";
在数组中存储这些变量的名称:
String[] v = {"dog", "cat", "mouse"};
现在让我们说我想将第一个变量(狗)更改为“贵宾犬”,但我不能直接引用该变量(dog = "Poodle"
),因为在实际示例中,我是正在工作,我不知道数组中的变量名将。该怎么办?
如何使Java理解v [0]是变量名而不是字符串?
这样我可以做类似的事情:
v[0] = "Poodle";
System.out.println(dog); // should be 'Poodle'
答案 0 :(得分:1)
您不想将它们存储为单独的标量变量。您希望它们在地图中存储和索引:
Map<String> animals = HashMap<>();
animals.put("dog", "Bulldog");
// ...
System.out.println(animals.get("dog"));
奖金功能-您可以 在Perl中执行此操作(动态使用变量名);如果是包作用域变量(实际上是正如Steve的注释所添加的,同样适用于Java中的类变量,通过反射)。但是,任何语言中所需的正确解决方案是使用地图/关联数组。
更新:根据用户的要求进行反思:以下是一些指南:
https://coderanch.com/t/565212/java/static-variable-Reflection
例如获得狗的价值:
Field field = MyClass4.class.getDeclaredField("dog");
Boolean fieldValue = (Boolean) field.get(null);
答案 1 :(得分:1)
您可以为此使用Map:
Map<String, String> animals = new HashMap<>();
animals.put("dog", "Bulldog");
animals.put("cat", "Birman");
animals.put("mouse", "Logitech");
animals.put("dog", "Poddle");
System.out.println(animals.get("dog"));
通过这种方式,您可以存储动态键值映射,并根据需要存储更新/添加/删除键及其关联值。
HashMap只是Map
界面的一种实现
答案 2 :(得分:0)
由于@DVK的建议,答案是使用Reflection。但是我只能使用它,因为变量(dog,cat,mouse)是类变量。哈希图建议不相关,因为它没有解决问题,正在改变实现。 (不能Map<Variable> v = HashMap<>();
做)-我的错是因为解释得不好。
Field declaredField = SomeClass.class.getDeclaredField("dog");
boolean accessible = declaredField.isAccessible();
declaredField.setAccessible(true);
declaredField.set(SomeClass.class, "Poodle");
declaredField.setAccessible(accessible);
System.out.println(dog); //success
这个问题answer:Set field value with reflection是解决问题的原因。