【问题标题】:How to use string to compare with field names in java?如何使用字符串与java中的字段名进行比较?
【发布时间】:2013-08-13 07:37:27
【问题描述】:

我有一个名为 MyClass 的课程。它有许多 MyField 类型的字段。如何返回对名称与字符串值匹配的特定字段的引用?

public class MyClass{
public MyField field1;
public MyField field2;
public MyField field3;

public MyField whichField(String nameOfField){
//e.g. String = "field3", then return field3
//of course I can do if else, but it will be tedious If I have long list of MyField fields, can I iterate over all field names, and return whose name matches?

}

}

编辑

我尝试从下面的答案中反思,我创建了一个临时占位符,我希望重新使用它,但是,

MyField temp = MyClass.class.getDeclaredField(whichFieldString);

不起作用,我得到类型不匹配,无法转换错误

我该如何施放这个? 如何返回此字段?

【问题讨论】:

  • 你的意思是说你有myFieldObject.getName()这样的东西?
  • 你可以用反射来做到这一点
  • 您最好将字段放入集合并遍历它。
  • 它应该是 Field 类型,而不是“MyField”...您应该为示例代码使用更正确的数据

标签: java


【解决方案1】:

作为替代方案:

如果所有字段都属于同一类型并通过字段名称访问(大部分时间),您可以通过使用Map 来避免使用反射的麻烦和脆弱性。

映射将键(在您的情况下为“字段名称”)与值相关联。 MyClass 不是任意数量的字段,而是如下所示:

public class MyClass {
   private final Map<String, MyField> fields = new HashMap<>();

   /* code to initially fill the map */

   public MyField whichField(String fieldName) {
      return fields.get(fieldName);
   }
}

【讨论】:

  • 这个对我来说听起来更实用。
【解决方案2】:

您可以通过反射来做到这一点。 A 类有我们要搜索的字段:

public class A {

    private String field1;
    private String field2;
    private String field3;

}

B 展示了如何遍历 A 中声明的字段,匹配特定的字段名称:

public class B {

    public B() {
        Field field = findFieldByName("field1");
        System.out.println(field);
    }

    private Field findFieldByName(String name) {
        Field[] fields = A.class.getDeclaredFields();
        for(Field f : fields) {
            if(f.getName().equals(name)) {
                return f;
            }
        }
        return null;
    }

    public static void main(String[] args) {
        new B();
    }
}

【讨论】:

  • 或者,当然你可以使用 clazz.getDeclaredField("myFielldName");正如下面的 C.Champagne 所说...
【解决方案3】:

你必须使用反射:

import java.lang.reflect.Field;

public class MyClass {
    public MyField field1;
    public MyField field2;
    public MyField field3;

    public MyField whichField(String nameOfField) {
        MyField fieldName = null;
        Field[] fields = MyClass.class.getDeclaredFields();
        for (Field field : fields) {
            if (field.getName().equals(nameOfField)) {
                // Do whatever you want to do
            }
        }

        return null;
    }

}

class MyField {
}

【讨论】:

    【解决方案4】:

    您可能想使用一个集合,例如Map&lt;String, MyField&gt;.

    【讨论】:

      【解决方案5】:

      您可以使用reflection轻松完成此操作

      Class<MyClass> clazz = MyClass.class;
      Field requieredField = clazz.getDeclaredField("myFielldName");
      

      编辑

      这个解决方案是相关的,是字段的数量是固定的。正如在 cmets 和 answers 中提到的,如果您想存储动态数量的值,那么 Map(如果您只需要枚举值,则使用 Collection)更合适。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-20
        • 2010-10-06
        • 2012-08-31
        • 1970-01-01
        • 2018-09-17
        • 1970-01-01
        • 2011-02-15
        相关资源
        最近更新 更多