Spec-Zone .ru
спецификации, руководства, описания, API
|
Есть несколько модификаторов, которые могут быть частью полевого объявления:
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 ]
Заметьте, что о некоторых полях сообщают даже при том, что они не объявляются в исходном коде. Это - то, потому что компилятор генерирует некоторые синтетические поля, которые необходимы во время времени выполнения. Чтобы протестировать, является ли поле синтетическим, пример вызывает Field.isSynthetic()
this$0
для внутренних классов (то есть вложенных классов, которые не являются статическими задействованными классами) сослаться на наиболее удаленное включение class и $VALUES
используемый перечислениями, чтобы реализовать неявно определенный статический метод values()
. Имена синтетических элементов class не определяются и, возможно, не то же самое во всех реализациях компилятора или выпусках. Эти и другие синтетические поля будут включены в массив, возвращенный Class.getDeclaredFields()
Class.getField()
public
.
Поскольку Field
java.lang.reflect.AnnotatedElement
java.lang.annotation.RetentionPolicy.RUNTIME