Download the JDK
Search the Tutorials
Hide the TOC
Trail: The Reflection API
Lesson: Members
Section: Fields
Members
Fields
Obtaining Field Types
Retrieving and Parsing Field Modifiers
Getting and Setting Field Values
Troubleshooting
Methods
Obtaining Method Type Information
Retrieving and Parsing Method Modifiers
Invoking Methods
Troubleshooting
Constructors
Finding Constructors
Retrieving and Parsing Constructor Modifiers
Creating New Class Instances
Troubleshooting
Home Page > The Reflection API > Members
Retrieving and Parsing Field Modifiers

> There are several modifiers that may be part of a field declaration:
> - Access modifiers: `public`, `protected`, and `private`
> - Field-specific modifiers governing runtime behavior: `transient` and `volatile`
> - Modifier restricting to one instance: `static`
> - Modifier prohibiting value modification: `final`
> - Annotations

> The method `Field.getModifiers()` can be used to return the integer representing the set of declared modifiers for the field. The bits representing the modifiers in this integer are defined in `java.lang.reflect.Modifier`.

> The ``FieldModifierSpy`` example illustrates how to search for fields with a given modifier. It also determines whether the located field is synthetic (compiler-generated) or is an enum constant by invoking `Field.isSynthetic()` and `Field.isEnumCostant()` respectively.

> >     import java.lang.reflect.Field;
> >     import java.lang.reflect.Modifier;
> >     import static java.lang.System.out;

> >     enum Spy { BLACK , WHITE }

> >     public class FieldModifierSpy {
> >         volatile int share;
> >         int instance;
> >         class Inner {}

> >         public static void main(String... args) {
> >     	try {
> >     	    Class<?> c = Class.forName(args[0]);
> >     	    int searchMods = 0x0;
> >     	    for (int i = 1; i < args.length; i++) {
> >     		searchMods |= modifierFromString(args[i]);
> >     	    }

> >     	    Field[] flds = c.getDeclaredFields();
> >     	    out.format("Fields in Class '%s' containing modifiers:  %s%n",
> >     		       c.getName(),
> >     		       Modifier.toString(searchMods));
> >     	    boolean found = false;
> >     	    for (Field f : flds) {
> >     		int foundMods = f.getModifiers();
> >     		// Require all of the requested modifiers to be present
> >     		if ((foundMods & searchMods) == searchMods) {
> >     		    out.format("%-8s [ synthetic=%-5b enum_constant=%-5b ]%n",
> >     			       f.getName(), f.isSynthetic(),
> >     			       f.isEnumConstant());
> >     		    found = true;
> >     		}
> >     	    }

> >     	    if (!found) {
> >     		out.format("No matching fields%n");
> >     	    }

> >             // production code should handle this exception more gracefully
> >     	} catch (ClassNotFoundException x) {
> >     	    x.printStackTrace();
> >     	}
> >         }

> >         private static int modifierFromString(String s) {
> >     	int m = 0x0;
> >     	if ("public".equals(s))           m |= Modifier.PUBLIC;
> >     	else if ("protected".equals(s))   m |= Modifier.PROTECTED;
> >     	else if ("private".equals(s))     m |= Modifier.PRIVATE;
> >     	else if ("static".equals(s))      m |= Modifier.STATIC;
> >     	else if ("final".equals(s))       m |= Modifier.FINAL;
> >     	else if ("transient".equals(s))   m |= Modifier.TRANSIENT;
> >     	else if ("volatile".equals(s))    m |= Modifier.VOLATILE;
> >     	return m;
> >         }
> >     }

> Sample output follows:

> >     $ java FieldModifierSpy FieldModifierSpy volatile
> >     Fields in Class 'FieldModifierSpy' containing modifiers:  volatile
> >     share    [ synthetic=false enum_constant=false ]
> >     $ java FieldModifierSpy Spy public
> >     Fields in Class 'Spy' containing modifiers:  public
> >     BLACK    [ synthetic=false enum_constant=true  ]
> >     WHITE    [ synthetic=false enum_constant=true  ]
> >     $ java FieldModifierSpy FieldModifierSpy\$Inner final
> >     Fields in Class 'FieldModifierSpy$Inner' containing modifiers:  final
> >     this$0   [ synthetic=true  enum_constant=false ]
> >     $ java FieldModifierSpy Spy private static final
> >     Fields in Class 'Spy' containing modifiers:  private static final
> >     $VALUES  [ synthetic=true  enum_constant=false ]

> Notice that some fields are reported even though they are not declared in the original code. This is because the compiler will generate some synthetic fields which are needed during runtime. To test whether a field is synthetic, the example invokes `Field.isSynthetic()`. The set of synthetic fields is compiler-dependent; however commonly used fields include `this$0` for inner classes (i.e. nested classes that are not static member classes) to reference the outermost enclosing class and `$VALUES` used by enums to implement the implicitly defined static method `values()`. The names of synthetic class members are not specified and may not be the same in all compiler implementations or releases. These and other synthetic fields will be included in the array returned by `Class.getDeclaredFields()` but not identified by `Class.getField()` since synthetic members are not typically `public`.

> Because `Field` implements the interface `java.lang.reflect.AnnotatedElement`, it is possible to retrieve any runtime annotation with `java.lang.annotation.RetentionPolicy.RUNTIME`. For an example of obtaining annotations see the section Examining Class Modifiers and Types.

Previous page: Obtaining Field Types
Next page: Getting and Setting Field Values