Java反射通过getModifiers()获取修饰符位掩码,用Modifier.toString()转字符串或位运算判断;字节码工具如ASM的access值与之兼容。

Java 中可以通过反射 API 直接获取类、字段、方法的访问修饰符标志位(即 int 类型的 modifiers 值),它是一个位掩码(bitmask),每个修饰符对应一个固定的整数值(如 public = 1、private = 2、protected = 4、static = 8 等)。你无需手动解析字节码,反射已封装好这些信息。
使用反射获取 modifiers 值
所有可反射的元素(Class、Field、Method、Constructor)都提供 getModifiers() 方法,返回一个 int 类型的标志位整数:
-
MyClass.class.getModifiers()→ 获取类本身的修饰符(如public final) -
MyClass.getDeclaredField("name").getModifiers()→ 获取字段修饰符 -
MyClass.getDeclaredMethod("doWork").getModifiers()→ 获取方法修饰符
将 modifiers 解析为可读的修饰符字符串
直接打印 getModifiers() 返回的是数字(如 17),需用 java.lang.reflect.Modifier 工具类转义:
-
Modifier.toString(int mod):返回空格分隔的修饰符字符串(如"public static final") -
Modifier.isPublic(int mod)、Modifier.isStatic(int mod)等:用于条件判断 - 也可用位运算判断:
(mod & Modifier.PUBLIC) != 0
示例:
立即学习“Java免费学习笔记(深入)”;
int m = String.class.getModifiers(); // 17 → public final System.out.println(Modifier.toString(m)); // "public final" System.out.println(Modifier.isFinal(m)); // true System.out.println((m & Modifier.PUBLIC) != 0); // true
通过字节码工具(如 ASM / Javassist)读取 modifiers
若需在**类加载前**或**脱离运行时环境**分析修饰符(例如构建工具、静态分析器),可使用字节码库。以 ASM 为例:
- 继承
ClassVisitor,重写visit()(类级修饰符)、visitField()(字段)、visitMethod()(方法) - 这些回调方法的首个参数就是
access(即原始 modifiers 整数) - 同样可用
Modifier.toString(access)或位判断,无需重新定义常量
注意:ASM 中的 access 与反射中 getModifiers() 的值完全一致(Java 规范定义,非 ASM 自定)。
常见 modifiers 常量对照(JDK 8+)
关键常量定义在 java.lang.reflect.Modifier 中,部分如下:
- public = 1
- private = 2
- protected = 4
- static = 8
- final = 16
- synchronized = 32
- volatile = 64
- transient = 128
- native = 256
- interface = 512
- abstract = 1024
- strictfp = 2048
- bridge = 64(编译器生成的桥接方法)
- synthetic = 4096(编译器生成的合成成员)
多个修饰符组合即按位或(如 public static = 1 | 8 = 9)。


















