在Java中,如何获取给出带有名称的字符串的属性?

时间:2010-01-11 17:14:17

标签: java

我很抱歉提出这类问题,但我真的找不到谷歌的答案。所以说我有一个private String myColor的课,我有一个字符串“myColor”。现在我想操纵myColor属性。我怎么能这样做?

修改 对于一个不明确的问题我很抱歉,我想最好的解释是我需要它。我有一个Swing表单,并希望在加载gui时使用首选项api来设置字段的值。所以我可以读取所有字段,然后为每个字段做outputDirectoryTextField.setText(valueFromPrefsAPI);,但这似乎是一些不需要的编码所以我想有一个数组(哈希?)与字段的名称和循环通过它们,像这样:

String[] myTextInputs = {"thisInput", "thatInput"};

for (String inputName : myTextInputs) {
    String value = prefs.get(inputName, "");
    /* some code I'm seeking to find out*/.setText(value);
}

5 个答案:

答案 0 :(得分:43)

您可以使用反射来检查任何对象的内容,如下所示:

Object o = ...; // The object you want to inspect
Class<?> c = o.getClass();

Field f = c.getDeclaredField("myColor");
f.setAccessible(true);

String valueOfMyColor = (String) f.get(o);

请注意,getDeclaredField()只返回对象类声明的字段。如果你正在寻找一个由超类声明的字段,你应该遍历对象的所有类(通过反复执行c = c.getSuperclass()直到c == null)

如果要更改字段的值,可以使用set方法:

f.set(o, "some-new-value-for-field-f-in-o")

其他详细信息:http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Field.html


https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getField(java.lang.String)

你可以使用getField(...),如果没有在课程中找到,它将搜索超类。

答案 1 :(得分:5)

根据编辑,我的建议是使用Map将首选项名称的地图包含到适当的文本字段或其他文本组件中。只需在构建用户界面时构建地图。

Map<String, JTextField> guiFields = new HashMap<String, JTextField>();

然后你可以让代码执行

guiFields.get(inputName).setText(value);

答案 2 :(得分:3)

如果我理解你的问题......你应该创建公共getter和setter:

public void setMyColor(String color) {
    this.myColor = color;
}

public String getMyColor {
    return this.myColor;
}

答案 3 :(得分:2)

这取决于您想要执行此操作的位置。在课堂上你只需要它,例如:

myColor = "blah blah";

从外面看,你需要有一些公共方法,正如其他帖子所示。在所有情况下,如果你的环境是多线程的,你必须要小心。类级变量不是线程安全的。

答案 4 :(得分:1)

您必须创建一个'mutator'来修改私有成员变量。

class example{
    private string myColor;
    public void changeColor(string newColor){
        myColor = newColor;
    }
}