Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
有几个修饰符可能是字段声明的一部分:
public
,protected
和 private
transient
和 volatile
static
final
方法 Field.getModifiers()
可用于返回表示字段的已声明修饰符集的整数。表示此整数中修饰符的位在 java.lang.reflect.Modifier
中定义。
示例说明了如何使用给定修饰符搜索字段。它还通过分别调用 FieldModifierSpy
Field.isSynthetic()
和 Field.isEnumCostant()
来确定所定位的字段是合成的(编译器生成的)还是枚举常量。
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; } }
示例输出如下:
$ 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 ]
请注意,即使它们未在原始代码中声明,也会报告某些字段。这是因为编译器将生成运行时所需的一些 synthetic fields (合成字段)。要测试字段是否为合成字段,示例将调用 Field.isSynthetic()
。合成字段集依赖于编译器;但是常用的字段包括 this$0
,用于内部类(即非静态成员类的嵌套类)引用最外层的封闭类,和枚举使用的 $VALUES
,其用来实现隐式定义的静态方法 values()
。类的合成成员的名称未指定,并且在所有编译器实现或发行版中可能不相同。这些和其他合成字段将包含在由 Class.getDeclaredFields()
返回的数组中,但不会被 Class.getField()
标识,因为合成成员通常不是 public
。
因为 Field
实现了接口 java.lang.reflect.AnnotatedElement
,所以可以获取任何使用 java.lang.annotation.RetentionPolicy.RUNTIME
的运行时注解。有关获取注解的示例,请参阅 Examining Class Modifiers and Types 部分。