Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java: How can I access a class's field by a name stored in a variable?

Tags:

java

class

field

How can I set or get a field in a class whose name is dynamic and stored in a string variable?

public class Test {      public String a1;     public String a2;        public Test(String key) {         this.key = 'found';  <--- error     }   } 
like image 931
ufk Avatar asked Jan 24 '10 13:01

ufk


People also ask

How do you access another class's variable?

You can access all the variables by using the subclass object, and you don't have to create an object of the parent class. This scenario only happens when the class is extended; otherwise, the only way to access it is by using the subclass.

How do you access the variable of an object?

Use the member-access operator ( . ) between the object variable name and the member name. If the member is Shared, you do not need a variable to access it.

Where do you declare member variables for a class?

You declare a class's member variables with the body of the class. Typically, you declare a class's variables before you declare its methods, although this is not required. Note: To declare variables that are a member of a class, the declarations must be within the class body, but not within the body of a method.


1 Answers

You have to use reflection:

  • Use Class.getField() to get a Field reference. If it's not public you'll need to call Class.getDeclaredField() instead
  • Use AccessibleObject.setAccessible to gain access to the field if it's not public
  • Use Field.set() to set the value, or one of the similarly-named methods if it's a primitive

Here's an example which deals with the simple case of a public field. A nicer alternative would be to use properties, if possible.

import java.lang.reflect.Field;  class DataObject {     // I don't like public fields; this is *solely*     // to make it easier to demonstrate     public String foo; }  public class Test {     public static void main(String[] args)         // Declaring that a method throws Exception is         // likewise usually a bad idea; consider the         // various failure cases carefully         throws Exception     {         Field field = DataObject.class.getField("foo");         DataObject o = new DataObject();         field.set(o, "new value");         System.out.println(o.foo);     } } 
like image 200
Jon Skeet Avatar answered Sep 21 '22 09:09

Jon Skeet