这些Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本引入的改进,并可能使用不再可用的技术。
请参阅Java语言变化以获取Java SE 9及后续版本中更新的语言特性的摘要。
请参阅JDK发行说明以获取有关所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息。
由于构造函数在语言中的作用,相对于方法来说,有意义的修饰符较少:
public、protected和private示例会查找指定访问修饰符的给定类中的构造函数。它还会显示构造函数是否是合成的(由编译器生成)或者是否具有可变数量参数。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());
}
}
// 生产代码应该更优雅地处理这个异常
} 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常量,因此需要检查三个访问修饰符的缺失来识别一个包私有的构造函数。
这个输出显示了在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 {
// 编译器将生成一个合成的构造函数,因为 SyntheticConstructor() 是私有的。
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 检索运行时注解的方法。有关获取注解的示例,请参见检查类修饰符和类型部分。