Class.getModifiers()返回整数,需用Modifier.isPublic等方法判断修饰符;其原理是各修饰符对应唯一2的幂次值,通过按位与运算检测;可用Modifier.toString()获取修饰符字符串。

Class.getModifiers() 返回的是一个整数,它把所有修饰符用二进制位的方式“打包”存储。要判断某个具体修饰符(比如 public、final、abstract)是否存在,不能直接比较数值大小,而是要用位运算——和 Modifier 提供的常量做按位与(&)操作。
用 Modifier.isPublic / isFinal / isAbstract 判断最简单
Java 已经封装好了常用判断方法,直接调用即可,无需手动位运算:
- Modifier.isPublic(modifiers) → 判断是否含 public
- Modifier.isFinal(modifiers) → 判断是否含 final
- Modifier.isAbstract(modifiers) → 判断是否含 abstract
例如:
Class<?> clazz = MyService.class; int mods = clazz.getModifiers(); boolean isPublic = Modifier.isPublic(mods); boolean isFinal = Modifier.isFinal(mods); boolean isAbstract = Modifier.isAbstract(mods);
理解背后的位运算原理
每个修饰符对应一个唯一的 2 的幂次值(即二进制中只有一个位为 1):
立即学习“Java免费学习笔记(深入)”;
- public → 0x00000001(二进制末位为 1)
- final → 0x00000010(第 5 位为 1)
- abstract → 0x00000400(第 11 位为 1)
getModifiers() 返回的整数,是这些值的“或”结果。只要某位为 1,就说明对应修饰符存在。所以判断逻辑是:(mods & Modifier.PUBLIC) != 0,其余同理。
一次性获取所有修饰符字符串
如果想看类上到底写了哪些修饰符(比如输出 "public abstract"),可用:
String desc = Modifier.toString(clazz.getModifiers()); // 返回如 "public abstract final"
这个字符串会按 Java 语言规范顺序排列,不含 private/protected(因为类不能用它们修饰),但会包含 interface、static(对嵌套类)、strictfp 等合法修饰符。
注意:类不能用 private 或 protected 修饰
顶层类只允许 public 或默认包访问(即无修饰符)。若 getModifiers() 中检测出 PRIVATE 或 PROTECTED,那一定是嵌套类(如内部类)。对嵌套类来说,private static final 是完全合法的。


















