469. Java 反射 - 读取修饰符
在 Java 语言中,很多元素都可以带有 修饰符(modifier):
- 类
- 字段(Field)
- 方法(Method)
- 构造器(Constructor)
- 方法和构造器参数
这些修饰符决定了 可见性、继承/重写的约束、能否被修改 等语义。通过反射 API,我们可以在运行时获取并分析这些修饰符。
1. 常见修饰符分类
- 访问控制修饰符:
public、protected、private - 继承相关:
abstract(必须重写)、final(不能继承/重写)、sealed/non-sealed - 作用域限制:
static(类级别成员) - 数值/执行行为:
strictfp(严格浮点计算) - 只读/常量:
final(字段不可修改,类不可继承) - 注解修饰符:比如
@Deprecated
⚠️ 注意:
- 并不是所有修饰符都能用于所有元素。例如:
interface不能是finalenum不能是abstract
2. getModifiers() 方法
Class、Method、Field、Constructor 都有 getModifiers() 方法:
int modifiers = SomeClass.class.getModifiers();
- 返回值是一个
int,每一位表示一个修饰符。 - 如果手动去解析这些位,会很繁琐。
- 幸运的是,Java 提供了
java.lang.reflect.Modifier工具类,可以帮我们解码。
3. 使用 Modifier 工具类解码
示例 1:检查 String 类
import java.lang.reflect.Modifier;
Class<?> s = String.class;
int modifiers = s.getModifiers();
System.out.println("Is String final? " + Modifier.isFinal(modifiers));
System.out.println("Is String abstract? " + Modifier.isAbstract(modifiers));
输出:
Is String final? true
Is String abstract? false
✅ 说明:
String是final类(不可继承)- 不是
abstract
示例 2:检查 Collection 接口
Class<?> c = java.util.Collection.class;
int modifiers = c.getModifiers();
System.out.println("Is Collection final? " + Modifier.isFinal(modifiers));
System.out.println("Is Collection abstract? " + Modifier.isAbstract(modifiers));
输出:
Is Collection final? false
Is Collection abstract? true
✅ 说明:
- 接口 隐式为
abstract(即使没有写) - 因此
Modifier.isAbstract(modifiers)返回true
4. 常见 Modifier 方法
java.lang.reflect.Modifier 提供了一系列静态方法来判断:
- 可见性
isPublic(int modifiers)isProtected(int modifiers)isPrivate(int modifiers)
- 继承/重写
isFinal(int modifiers)isAbstract(int modifiers)isStatic(int modifiers)
- 其他
toString(int modifiers)→ 把修饰符打印成人类可读的字符串
5. 总结
getModifiers()返回一个 位掩码(bitmask),用Modifier工具类解码即可。Modifier.isXXX(modifiers)方法能快速判断某个修饰符是否存在。- 接口自动带
abstract,即使源码里没写。 - 在框架开发(如 ORM、依赖注入容器)中,反射修饰符信息常用于:
- 判断类是否可实例化(不是
abstract、不是interface) - 判断方法是否
public - 判断字段是否
final
- 判断类是否可实例化(不是