Java中是否有任何数据结构(或类似结构),可以为对象中的变量设置值,如下所示:
myInstanceVariable.set("myVariableName").value("200")
我发现通过使用反射或映射可以获得类似的东西,但不使用上述语法。
有没有这样的数据结构或机制,或者我必须自己实现它?
这听起来是一个很好的例子,您可以使用Map
,可能是HashMap
。
请参阅此处的Map
文档:https://docs.oracle.com/javase/8/docs/api/java/util/Map.html
有关各种藏品的信息,请参阅此处的问题:
我应该使用什么Java Collection?
地图没有你上面给出的语法,但它很接近。myMap.put("myVariableName", "200");
如果它是Map<String, Integer>
,您也可以执行myMap.put("myVariableName", 200)
,尽管每个值都需要是Integer
。
您可以使用地图:
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
。
首先,使用反射通常不是最佳解决方案。也许你应该想想你真正想实现的目标,想想这是否是另一种方式?
话虽如此,我认为最接近您所指的fluent反射的是jOOR,这是一个用于Java的轻量级第三方fluent反射API。
在您的情况下,您可以通过以下方式使用反射来设置变量(前提是您已经静态导入了必要的方法):
on(myInstanceVariable).set("myVariableName", 200);
如果您想要精确的语法,那么没有。但是,您可以创建自己的数据结构。它很可能会包装地图。