如何使用已作为字符串传递的变量名?

时间:2019-05-23 19:24:55

标签: java

我有普通的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'

3 个答案:

答案 0 :(得分:1)

您不想将它们存储为单独的标量变量。您希望它们在地图中存储和索引:

Map<String> animals = HashMap<>();
animals.put("dog", "Bulldog");

//  ...

System.out.println(animals.get("dog"));

奖金功能-您可以 在Perl中执行此操作(动态使用变量名);如果是包作用域变量(实际上是正如Steve的注释所添加的,同样适用于Java中的类变量,通过反射)。但是,任何语言中所需的正确解决方案是使用地图/关联数组。

更新:根据用户的要求进行反思:以下是一些指南:

https://javahowtodoit.wordpress.com/2014/09/12/how-to-get-and-set-private-static-final-field-using-java-reflection/

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

这个问题answerSet field value with reflection是解决问题的原因。