Spec-Zone .ru
спецификации, руководства, описания, API
|
Из-за роли конструкторов на языке меньше модификаторов значимо чем для методов:
public
, protected
, и private
пример ищет конструкторов в данном class с указанным модификатором доступа. Это также выводит на экран, является ли конструктор синтетическим (сгенерированный компилятором) или переменной арности.ConstructorAccess
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