【问题标题】:In Java, how to get attribute given the string with its name?在Java中,如何获取给定字符串及其名称的属性?
【发布时间】:2020-05-26 05:21:47
【问题描述】:

很抱歉提出此类问题,但我真的无法在 Google 中找到答案。所以说我有一个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);
}

【问题讨论】:

  • 检查我的个人资料页面中的链接,它是为此目的而制作的。使用我的实用程序,您只需要执行BeanPropertyController bpc = BeanPropertyController.of(YourClass.class, ExtractionDepth.FIELDS); bpc.mutate("myColor", itsNewValue); 但是请注意ExtractionDepth.FIELDS 假定至少存在一个匹配名称的字段的getter。

标签: java


【解决方案1】:

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

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(...) 如果在类中找不到,它将搜索超类。

【讨论】:

  • 您需要在最后一行显式转换为String,因为Fields 不是通用的,因此get() 返回Object 类型的结果。您还需要捕获各种类型的安全异常,并注意根据环境,此代码可能根本无法运行。 OP 要求的,但它只负责让他知道这些事情并引导他找到更合适的替代方案。
【解决方案2】:

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

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

然后你可以让代码做

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      这取决于您要在哪里执行此操作。在课堂内,您只需随心所欲,例如:

      myColor = "blah blah";
      

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • Setters 和 Getters 是一种更常见的方法;请参阅 Mickel 的代码示例。
        • mutator 是 setter 的另一个名称。 en.wikipedia.org/wiki/Mutator_method > mutator 方法,有时称为“setter”...
        猜你喜欢
        • 2014-05-12
        • 2020-04-21
        • 1970-01-01
        • 2012-05-06
        • 1970-01-01
        相关资源
        最近更新 更多