public class MyTest {
public int a;
public static int b;
public static final int c = 0;
private int d;
}
1. 修飾符
public static void main(String[]args) {
Class<?> clazz = MyTest.class;
Field[] fields = clazz.getDeclaredFields();
for(Field field : fields) {
System.out.print(field.getName() +"->");
System.out.println(field.getModifiers());
}
}
輸出:
a->1
b->9
c->25
d->2
- 通過返回的int類型的值胚泌,還是很難判斷這些變量有哪些修飾符蚁袭。
在這里鱼响,需要用到
java.lang.reflect.Modifier
這個類。Modifier提供了很多靜態(tài)方法沟突。如public static String toString(int mod)
就可以輸出該整數(shù)對應(yīng)的所有的修飾符花颗。public static boolean isPublic(int mod)
就可以判斷該整數(shù)對應(yīng)的是不是包含public修飾符。
public static void main(String[] args) {
Class<?> clazz = MyTest.class;
Field[] fields = clazz.getDeclaredFields();
for(Field field : fields) {
System.out.print(field.getName() +"->");
System.out.println(Modifier.toString(field.getModifiers()));
}
}
輸出:
a->public
b->public static
c->public static final
d->private
通過Modifier的isPublic
惠拭、isPrivate
扩劝、isStatic
等方法,可以判斷是否包含某些修飾符职辅,現(xiàn)在如果有這么一個需求今野,我需要找到僅有public static
兩個修飾符的變量。
現(xiàn)在看下Modifier的源碼罐农,可以看到以下代碼:
public static final int PUBLIC = 0x00000001;
public static final int PRIVATE =0x00000002;
public static final int PROTECTED = 0x00000004;
public static final int STATIC =0x00000008;
public static final int FINAL =0x00000010;
public static final int SYNCHRONIZED = 0x00000020;
··· | native | transient | volatile | synchronized | final | static | protected | private | public |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
把它們轉(zhuǎn)換成二進(jìn)制条霜,可以看出,Modifier使用一個二進(jìn)制的位來表示是否包含某個修飾符涵亏。
如果是public static宰睡,對應(yīng)的整數(shù)就是二進(jìn)制的:1001蒲凶,也就是9。如下圖:
··· | native | transient | volatile | synchronized | final | static | protected | private | public |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
如果是public static final就是11001拆内,也就是25旋圆。
現(xiàn)在如果想判斷是否僅有public static兩個修飾符,那么就可以判斷是否field.getModifiers() == 9麸恍。