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

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

Из-за роли конструкторов на языке меньше модификаторов значимо чем для методов:

ConstructorAccess пример ищет конструкторов в данном class с указанным модификатором доступа. Это также выводит на экран, является ли конструктор синтетическим (сгенерированный компилятором) или переменной арности.


import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import static java.lang.System.out;

public class ConstructorAccess {
    public static void main(String... args) {
	try {
	    Class<?> c = Class.forName(args[0]);
	    Constructor[] allConstructors = c.getDeclaredConstructors();
	    for (Constructor ctor : allConstructors) {
		int searchMod = modifierFromString(args[1]);
		int mods = accessModifiers(ctor.getModifiers());
		if (searchMod == mods) {
		    out.format("%s%n", ctor.toGenericString());
		    out.format("  [ synthetic=%-5b var_args=%-5b ]%n",
			       ctor.isSynthetic(), ctor.isVarArgs());
		}
	    }

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

    private static int accessModifiers(int m) {
	return m & (Modifier.PUBLIC | Modifier.PRIVATE | Modifier.PROTECTED);
    }

    private static int modifierFromString(String s) {
	if ("public".equals(s))               return Modifier.PUBLIC;
	else if ("protected".equals(s))       return Modifier.PROTECTED;
	else if ("private".equals(s))         return Modifier.PRIVATE;
	else if ("package-private".equals(s)) return 0;
	else return -1;
    }
}

Нет явного Modifier постоянный, который соответствует "частному на пакет" доступу, таким образом, необходимо проверить на отсутствие всех трех модификаторов доступа, чтобы идентифицировать частного на пакет конструктора.

Этот вывод показывает частным конструкторам в java.io.File:

$ java ConstructorAccess java.io.File private
private java.io.File(java.lang.String,int)
  [ synthetic=false var_args=false ]
private java.io.File(java.lang.String,java.io.File)
  [ synthetic=false var_args=false ]

Синтетические конструкторы редки; однако SyntheticConstructor пример иллюстрирует типичную ситуацию, где это может произойти:


public class SyntheticConstructor {
    private SyntheticConstructor() {}
    class Inner {
	// Compiler will generate a synthetic constructor since
	// SyntheticConstructor() is private.
	Inner() { new SyntheticConstructor(); }
    }
}
$ java ConstructorAccess SyntheticConstructor package-private
SyntheticConstructor(SyntheticConstructor$1)
  [ synthetic=true  var_args=false ]

Так как конструктор внутреннего class ссылается на частного конструктора включения class, компилятор должен генерировать частного на пакет конструктора. Тип параметра SyntheticConstructor$1 произвольно и зависит от реализации компилятора. Код, который зависит от присутствия любых синтетических или непубличных элементов class, возможно, не переносим.

Реализация конструкторов java.lang.reflect.AnnotatedElement, который обеспечивает методы, чтобы получить аннотации времени выполнения с java.lang.annotation.RetentionPolicy.RUNTIME. Для примера получения аннотаций см. раздел Модификаторов и Типов Класса Исследования.


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

Предыдущая страница: Обнаружение Конструкторов
Следующая страница: Создание Новых Экземпляров Класса