可以通过set(..).value(..)设置变量吗



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);

如果您想要精确的语法,那么没有。但是,您可以创建自己的数据结构。它很可能会包装地图。

最新更新