469. Java 反射 - 读取修饰符

0 阅读2分钟

469. Java 反射 - 读取修饰符

在 Java 语言中,很多元素都可以带有 修饰符(modifier)

  • 字段(Field)
  • 方法(Method)
  • 构造器(Constructor)
  • 方法和构造器参数

这些修饰符决定了 可见性继承/重写的约束能否被修改 等语义。通过反射 API,我们可以在运行时获取并分析这些修饰符。


1. 常见修饰符分类

  • 访问控制修饰符publicprotectedprivate
  • 继承相关abstract(必须重写)、final(不能继承/重写)、sealed / non-sealed
  • 作用域限制static(类级别成员)
  • 数值/执行行为strictfp(严格浮点计算)
  • 只读/常量final(字段不可修改,类不可继承)
  • 注解修饰符:比如 @Deprecated

⚠️ 注意:

  • 并不是所有修饰符都能用于所有元素。例如:
    • interface 不能是 final
    • enum 不能是 abstract

2. getModifiers() 方法

ClassMethodFieldConstructor 都有 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

说明

  • Stringfinal 类(不可继承)
  • 不是 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