检索和解析构造函数修饰符
由于构造函数在语言中的作用,因此有意义的修饰符比方法少:
-
访问修饰符:
public
,protected
和private
-
Annotations
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;
}
}
没有与“ package-private”访问相对应的显式Modifier常量,因此有必要检查所有三个访问修饰符的缺失以标识 package-private 构造函数。
此输出显示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 ]
由于内部类的构造函数引用了封闭类的私有构造函数,因此编译器必须生成程序包私有的构造函数。参数类型SyntheticConstructor$1
是任意的,并且取决于编译器的实现。依赖于任何合成或非公共类成员的存在的代码可能无法移植。
构造函数实现java.lang.reflect.AnnotatedElement,该方法提供了使用java.lang.annotation.RetentionPolicy.RUNTIME检索运行时注解的方法。有关获取 注解 的示例,请参见检查类修饰符和类型部分。