Spec-Zone .ru
спецификации, руководства, описания, API
След: API Reflection
Урок: Элементы
Раздел: Поля
Получение и Парсинг Полевых Модификаторов
Домашняя страница > API Reflection > Элементы

Получение и Парсинг Полевых Модификаторов

Есть несколько модификаторов, которые могут быть частью полевого объявления:

Метод 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. Для примера получения аннотаций см., что раздел Исследует Модификаторы Класса и Типы.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Получение Типов поля
Следующая страница: Получение и Установка Значений полей