繁体   English   中英

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

[英]In Java, how to get attribute given the string with its name?

我很抱歉问这种问题,但我真的无法在谷歌中找到答案。 所以说我有一个带有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);
}

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

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

其他详细信息: https : //docs.oracle.com/javase/6/docs/api/java/lang/reflect/Field.html


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

您可以使用 getField(...) 如果在类中找不到,它将搜索超类。

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

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

然后你可以让代码做

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

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

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

public String getMyColor {
    return this.myColor;
}

这取决于您想在哪里执行此操作。 在课堂上,你可以随意使用它,例如:

myColor = "blah blah";

从外部来看,您通常需要像其他帖子所指出的那样拥有一些公共方法。 在所有情况下,如果您的环境是多线程的,您必须小心。 类级变量不是线程安全的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM