Java中是否有任何数据结构(或类似),可以在这样的对象中设置变量值:
myInstanceVariable.set("myVariableName").value("200")
我发现通过使用反射或贴图可以获得类似的东西,但不能使用上面的语法。
是否有这样的数据结构或机制,还是我必须自己实现?
答案 0 :(得分:1)
这听起来像是一个很好的案例,你可以使用Map
,可能是HashMap
。
请参阅此处的Map
文档:
https://docs.oracle.com/javase/8/docs/api/java/util/Map.html
有关各种收藏品的信息,请在此处查看此问题:
What Java Collection should I use?
地图上面没有你给出的语法,但它很接近。 myMap.put("myVariableName", "200");
如果是Map<String, Integer>
,您也可以myMap.put("myVariableName", 200)
,但每个值都需要Integer
。
答案 1 :(得分:1)
您可以使用地图:
Map<String, String> data = new HashMap();
data.put("myVariableName", "200");
String value = data.get("myVariableName");
System.out.println(value); //shows 200
或者,使用反射自己:
private class Attribute {
public Object target;
public String varName;
public Class clazz;
public Attribute(String varName, Object target, Class clazz) {
this.varName = varName;
this.target = target;
this.clazz = clazz;
}
public void value(String value) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//Call setter method
Method method = target.getClass().getMethod("set" + varName, clazz);
method.invoke(target, value);
}
}
示例:
public class Person {
private String name;
public String getName() {
return name;
}
//This method must exist
public void setName(String name) {
this.name = name;
}
public void set(String varName) throws Exception {
return new Attribute(varName, this, Person.class);
}
}
主要:
public static void main(String[] args) throws Exception {
Person p = new Person();
p.set("Name").value("John"); //Notice the first letter uppercase
}
我不建议使用此解决方案,但这是您正在寻找的,所以...我建议您使用包裹的Map
。
答案 2 :(得分:0)
如果您想要准确提供您提供的语法,那么就没有,那就没有了。但是,您可以创建自己的数据结构。它最有可能包裹一张地图。
答案 3 :(得分:0)
首先,使用反射通常不是最佳解决方案。也许你应该考虑一下你真正想要实现的目标,并考虑它是否是另一种方式呢?
话虽如此,我认为你所能接近的流利反射最接近的是jOOR,这是一个用于Java的轻量级第三方流畅反射API。
在您的情况下,您可以通过以下方式使用反射设置变量(前提是您已静态导入必要的方法):
on(myInstanceVariable).set("myVariableName", 200);