是否可以通过set(...)。value(...)设置变量?

时间:2016-04-07 13:45:56

标签: java variables

Java中是否有任何数据结构(或类似),可以在这样的对象中设置变量值:

myInstanceVariable.set("myVariableName").value("200")

我发现通过使用反射或贴图可以获得类似的东西,但不能使用上面的语法。

是否有这样的数据结构或机制,还是我必须自己实现?

4 个答案:

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