检索和解析字段修饰符
字段声明中可能包含几个修饰符:
-
访问修饰符:
public
,protected
和private
-
控制运行时行为的特定于字段的修饰符:
transient
和volatile
-
修饰符仅限一个实例:
static
-
禁止修改值的修饰符:
final
-
Annotations
方法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
用于内部类(即不是静态成员类的嵌套类)以引用最外面的封闭类,以及$VALUES
枚举用于实现隐式定义的静态方法values()
。合成类成员的名称未指定,并且在所有编译器实现或发行版中可能都不相同。这些和其他合成字段将包含在Class.getDeclaredFields()返回的数组中,但不会由Class.getField()标识,因为合成成员通常不是public
。
由于Field实现了interfacejava.lang.reflect.AnnotatedElement,因此可以使用java.lang.annotation.RetentionPolicy.RUNTIME检索任何运行时 注解。有关获取 注解 的示例,请参见检查类修饰符和类型部分。