论 f.getModifiers() & Modifier.FINAL &Modifier.STATIC 如何成立
2015-08-05 11:16
676 查看
此篇紧接《将HttpServletRequest中的参数反射至实体类》文:
如果&、|、&&、||没弄清楚的同学,请戳这里!
首先在《API之家》中查询关于java.lang.reflect.Field的资料,如下:
http://www.apihome.cn/api/java/Field.html
其实关键在于getModifiers方法,API中是这样写的:
getModifiers() :以整数形式返回由此 Field 对象表示的字段的 Java 语言修饰符。
这里的整数形式就来源于:java.lang.reflect.Modifier
我截取了最常用的4个(PUBLIC、PRIVATE、PROTECTED、STATIC、FINAL),如下(十六进制)
转为十进制会更容易理解一些,如下:
我新增了一个VO来存储4种不同的属性:
1. private static final 修饰
2. private static 修饰
3. public final 修饰
4. private 修饰
运行结果如下:
1. private static final 修饰:
与final修饰判断
f.getModifiers()值:
11010 == 26(注:private:2+static:8+final:16 = 26)
Modifier.FINAL的值:
10000 == 16
结果:10000 == 16
与static修饰判断
f.getModifiers()值:
11010 == 26(注:private:2+static:8+final:16 = 26)
Modifier.STATIC的值:
01000 == 8
结果:01000 == 8
2. private static 修饰:
与final修饰判断
f.getModifiers()值:
01010 == 10(注:private:2+static:8 = 10)
Modifier.FINAL的值:
10000 == 16
结果:00000 == 0
与static修饰判断
f.getModifiers()值:
01010 == 10(注:private:2+static:8 = 10)
Modifier.STATIC的值:
01000 == 8
结果:01000 == 8
3. public final 修饰:
与final修饰判断
f.getModifiers()值:
10001 == 17(注:private:1+final:16 = 17)
Modifier.FINAL的值:
10000 == 16
结果:10000 == 16
与static修饰判断
f.getModifiers()值:
10001 == 17(注:private:1+final:16 = 17)
Modifier.STATIC的值:
01000 == 8
结果:00000 == 0
4. private 修饰:
与final修饰判断
f.getModifiers()值:
00010 == 2(注:private:2)
Modifier.FINAL的值:
10000 == 16
结果:00000 == 0
与static修饰判断
f.getModifiers()值:
00010 == 2(注:private:2)
Modifier.STATIC的值:
01000 == 8
结果:00000 == 0
结论:
很明显的可以看出在运行中整个执行过程,已经很清晰明了,唯一不同的是,在java.lang.reflect.Modifier中的修饰int值存在多个并存的情况时,比如上述中的 private static final 的f.getModifiers()值:返回的是十进制26(是一个累加的过程),转换二进制为:11010 ,第一位是1,这样就既然满足了Modifier.FINAL的值:10000 == 16,也满足了Modifier.STATIC的值:01000 == 8
如果&、|、&&、||没弄清楚的同学,请戳这里!
首先在《API之家》中查询关于java.lang.reflect.Field的资料,如下:
http://www.apihome.cn/api/java/Field.html
其实关键在于getModifiers方法,API中是这样写的:
getModifiers() :以整数形式返回由此 Field 对象表示的字段的 Java 语言修饰符。
这里的整数形式就来源于:java.lang.reflect.Modifier
我截取了最常用的4个(PUBLIC、PRIVATE、PROTECTED、STATIC、FINAL),如下(十六进制)
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;
转为十进制会更容易理解一些,如下:
//0x00000001(十六进制) = 1(十进制) public static final int PUBLIC = 1; //0x00000002(十六进制) = 2(十进制) public static final int PRIVATE = 2; //0x00000004(十六进制) = 4(十进制) public static final int PROTECTED = 4; //0x00000008(十六进制) = 8(十进制) public static final int STATIC = 8; //0x00000010(十六进制) = 16(十进制) public static final int FINAL = 16;
我新增了一个VO来存储4种不同的属性:
1. private static final 修饰
2. private static 修饰
3. public final 修饰
4. private 修饰
运行结果如下:
1. private static final 修饰:
与final修饰判断
f.getModifiers()值:
11010 == 26(注:private:2+static:8+final:16 = 26)
Modifier.FINAL的值:
10000 == 16
结果:10000 == 16
与static修饰判断
f.getModifiers()值:
11010 == 26(注:private:2+static:8+final:16 = 26)
Modifier.STATIC的值:
01000 == 8
结果:01000 == 8
2. private static 修饰:
与final修饰判断
f.getModifiers()值:
01010 == 10(注:private:2+static:8 = 10)
Modifier.FINAL的值:
10000 == 16
结果:00000 == 0
与static修饰判断
f.getModifiers()值:
01010 == 10(注:private:2+static:8 = 10)
Modifier.STATIC的值:
01000 == 8
结果:01000 == 8
3. public final 修饰:
与final修饰判断
f.getModifiers()值:
10001 == 17(注:private:1+final:16 = 17)
Modifier.FINAL的值:
10000 == 16
结果:10000 == 16
与static修饰判断
f.getModifiers()值:
10001 == 17(注:private:1+final:16 = 17)
Modifier.STATIC的值:
01000 == 8
结果:00000 == 0
4. private 修饰:
与final修饰判断
f.getModifiers()值:
00010 == 2(注:private:2)
Modifier.FINAL的值:
10000 == 16
结果:00000 == 0
与static修饰判断
f.getModifiers()值:
00010 == 2(注:private:2)
Modifier.STATIC的值:
01000 == 8
结果:00000 == 0
结论:
很明显的可以看出在运行中整个执行过程,已经很清晰明了,唯一不同的是,在java.lang.reflect.Modifier中的修饰int值存在多个并存的情况时,比如上述中的 private static final 的f.getModifiers()值:返回的是十进制26(是一个累加的过程),转换二进制为:11010 ,第一位是1,这样就既然满足了Modifier.FINAL的值:10000 == 16,也满足了Modifier.STATIC的值:01000 == 8
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统