根据字符串检查类的构造函数中是否有变量?

时间:2017-01-21 21:09:25

标签: java

我们假设我有一个名为Person的类,其构造函数包含nameagehairColor等变量。如果我有一个函数接收到一个应该匹配类变量之一的字符串,我怎么能检查该类是否真的有这个变量,我怎么能去修改它?例如:

public class Person {
    public String name;
    public int age;
    public String hairColor;

    public Person() {
        name = "Bryce";
        age = 21;
        hairColor = "brown";
    }

    public void changeHairColor(String variable, String color) {
        if (/*this class contains the variable passed as an argument to this method*/) {
            // Person[variable] = color
        }
    }
}

我主要是一个python dev,因此方法changeHairColor中有一些伪python。我希望能够以类似的方式编辑变量,您可以使用Python编辑字典中的变量:

person = {
    "name": "Bryce",
    "age": 21,
    "hairColor": "brown"
}

def changeHairColor(variable, color):
    person[variable] = color

如果可能的话。

3 个答案:

答案 0 :(得分:3)

在Java中执行此操作的唯一方法是使用Java Reflection API

public class Test {
    public String name;
    public int age;
    public String hairColor;

    public void setProperty(String property, Object value) {
        try {
            Field declaredField = this.getClass().getDeclaredField(property);
            switch (declaredField.getAnnotatedType().getType().getTypeName()) {
                case "java.lang.String":
                    declaredField.set(this, value);
                    break;
                // handle other types
            }
        } catch (NoSuchFieldException e) {
            // handle exception
        } catch (IllegalAccessException e) {
            // handle exception
        }
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.setProperty("name", "Bob");
        System.out.println(test.name);
    }
}

答案 1 :(得分:1)

我不会用反思解决这个问题。如果您的test具有一组可枚举的属性,我会将这些属性建模为Java test,并将test对象中的属性值存储在PlayerCharacter中:

enum

使用PlayerCharacter代替普通旧EnumMap(+反射)的最大好处是,这样您就可以获得使用{的代码的编译时类型安全性{1}}。

答案 2 :(得分:0)

使用Reflection API,您可以在运行时访问对象上的方法和属性。另一个答案描述了它的用法。但我不建议您解决问题。如下:

   public void changeHairColor(String variable, String color) {
       if("name".equalsIgnoreCase(variable))
           this.name = color;
       else if("age".equalsIgnoreCase(variable))
           this.age = Integer.parseInt(color);
       else if("color".equalsIgnoreCase(variable))
            this.color = color;
       else
           throw new Exception ("error - property not available"); 
      }
   }

注意,您现有的方法名称' changeHairColor'在上下文中没有意义。它应该像“变更属性”一样。因为您不只是更改“颜色”,而是使用此方法更改任何可用属性。