Java针对类、成员变量、方法,有很多修饰符,例如public、private、static、final、synchronized、abstract等,这些修饰符用来控制访问权限或其他特性。

本文就用成员变量(Field)来举例说明,类以及方法的修饰符获取与成员变量是一样的。

先看一个类

public class MyTest

{

public int a;

public static int b;

public static final int c = 0;

private int d;

}

通过反射,可以拿到这四个变量:

public static void main(String[] args) {

Class<?> clazz = MyTest.class;

Field[] fields = clazz.getDeclaredFields();//获取这个类所有的成员变量

for(Field field : fields) {

System.out.println(field.getName());

}

}

输出:

a

b

c

d

现在,我想知道每个变量的带有哪些修饰符,或者是不是包含某个修饰符。

先看下Member接口:Member表示一个类中的成员,包括成员变量、方法、构造方法三种实现,上面用到的Field就是Member的一种。

Java文档:

java.lang.reflect

接口 Member

所有已知实现类:

Constructor(构造方法), Field(成员变量), Method(方法)

Member接口有个方法:

int   getModifiers()

作为整数返回由此 Member所表示的成员或构造方法的 Java语言修饰符。

同时再看java.lang.Class类中也有同样的一个方法:

int   getModifiers()

返回此类或接口以整数编码的 Java语言修饰符。

这个方法就是返回一个int型的返回值,代表类、成员变量、方法的修饰符。

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提供了很多静态方法。如public static String toString(int mod)就可以输出该整数对应的所有的修饰符。public static boolean isPublic(int mod)就可以判断该整数对应的是不是包含public修饰符。

修改上面代码,把返回的整数转换通过Modifier转换一下:

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等方法,可以判断是否包含某些修饰符,现在如果有这么一个需求,我需要找到仅有publicstatic两个修饰符的变量。

现在看下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;

……还有很多 此处省略一万字

把它们转换成二进制,可以看出,Modifier使用一个二进制的位来表示是否包含某个修饰符。

……

native

transient

volatile

synchronized

final

static

protected

private

public

也就是,如果是public static,对应的整数就是二进制的:1001,也就是9。如下图:

……

native

transient

volatile

synchronized

final

static

protected

private

public

0

0

0

0

0

1

0

0

1

如果是public static final就是11001,也就是25。

现在如果想判断是否仅有public static两个修饰符,那么就可以判断是否field.getModifiers() == 25。

另外,我们也可以看到这里设计之精妙之处:用二进制位来标记是否包含某个修饰符。

最新文章

  1. spring通过静态方法获得properties文件的值
  2. SlideAndDragListView,一个可排序可滑动item的ListView
  3. java学习笔记(3):网络编程
  4. codeforces A. Sereja and Bottles 解题报告
  5. 更新安装xcode7插件
  6. JST(JavaScript Trimpath)前端模板引擎简介
  7. Student
  8. Valgrind简介:
  9. Python进阶之路---1.5python数据类型-字符串
  10. php学习笔记位运算
  11. static修饰符详解
  12. synchronized和volatile简介
  13. Python爬虫入门教程 46-100 Charles抓取手机收音机-手机APP爬虫部分
  14. Web后端 JAVAWeb面试考查知识点
  15. MySQL高可用之组复制(4):详细分析组复制理论
  16. Java集合之TreeMap源码分析
  17. 转载:OSG::Quat(四元数)用法
  18. window.jQuery || document...
  19. 201621123006 《Java程序设计》第7周学习总结
  20. 为什么JSP会比Beetl慢

热门文章

  1. XAF:如何让用户在运行时个性化界面并将个性化信息保存到数据库中 win/web/entityframework/xpo
  2. [poj2349]Arctic Network(最小生成树+贪心)
  3. venus
  4. ~/.config/user-dirs.dirs【桌面设置】
  5. 4.AE中的缩放,书签
  6. centos 6.5重置Root密码
  7. js制作简单的计算器
  8. 深入浅出Mybatis系列(七)---mapper映射文件配置之insert、update、delete
  9. Joomla
  10. ios基础篇(二十六)—— UITableViewCell的分组索引与标记