您的位置:首页 > 编程语言 > Java开发

论 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),如下(十六进制)

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