我们假设我有一个名为Person
的类,其构造函数包含name
,age
,hairColor
等变量。如果我有一个函数接收到一个应该匹配类变量之一的字符串,我怎么能检查该类是否真的有这个变量,我怎么能去修改它?例如:
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
如果可能的话。
答案 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'在上下文中没有意义。它应该像“变更属性”一样。因为您不只是更改“颜色”,而是使用此方法更改任何可用属性。