我有一个名为MyClass的类。它有许多MyField类型的字段。如何返回对名称与String值相匹配的特定字段的引用?
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);
不起作用,我得到类型不匹配,无法转换错误
我如何投这个? 我该如何归还这个字段?
答案 0 :(得分:3)
作为替代方案:
如果所有字段属于同一类型并且通过字段名称访问(大多数情况下),则可以避免使用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);
}
}
答案 1 :(得分:0)
您可以使用reflection
轻松完成Class<MyClass> clazz = MyClass.class;
Field requieredField = clazz.getDeclaredField("myFielldName");
修改强>
这个解决方案是相关的是固定的字段数。正如在评论和答案中提到的那样,如果您想存储动态数量的值,那么Map(或者只需要枚举值的集合)就更合适了。
答案 2 :(得分:0)
你可以用反射做到这一点。 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();
}
}
答案 3 :(得分:0)
你必须使用反射:
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 :(得分:0)
您可能想要使用一个集合,例如Map<String, MyField>
。