user494461
user494461

Reputation:

How to use string to compare with field names in java?

I have a class named MyClass. It has many fields of type MyField. How do I return a reference to a particular field whose name matches a String's value?

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?

}

}

edit

I tried reflection from the answers below, I create a temp placeholder, and I wish to reutrn it but,

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

doesnt work, I get type mismatch, cant convert error

How do I cast this? How do I return this field?

Upvotes: 0

Views: 2620

Answers (5)

C.Champagne
C.Champagne

Reputation: 5489

You can do it easily with reflection

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

EDIT

This solution is pertinent is the number of fields is fixed. As it was mentioned in comments and answers, if you want to store a dynamic number of values, then a Map (or a Collection if you only need to enumerate the values) is much more suitable.

Upvotes: 0

Steffen
Steffen

Reputation: 31

You may want to use a collection, e.g. Map<String, MyField>.

Upvotes: 0

Luis Sep
Luis Sep

Reputation: 2412

You'll have to use reflection:

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 {
}

Upvotes: 0

PA001
PA001

Reputation: 451

You can do this with reflection. Class A has the fields we want to search through:

public class A {

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

}

And B shows how to iterate over the fields declared in A, matching on a particular field name:

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();
    }
}

Upvotes: 0

Pyranja
Pyranja

Reputation: 3599

As an alternative:

If all fields are of the same type and are accessed by their field name (most of the time) you could avoid the hassle and brittleness of using reflection by utilizing a Map.

The map associates a key (in your case the "field name") with a value. Instead of an arbitrary number of fields, MyClass would look like:

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);
   }
}

Upvotes: 3

Related Questions