470. Java 反射 - Member 接口与 AccessFlag

文章目录

  • [470. Java 反射 - Member 接口与 AccessFlag](#470. Java 反射 - Member 接口与 AccessFlag)
    • [1. `getModifiers()` 的两处声明](#1. getModifiers() 的两处声明)
    • [2. Java 20 新增:`accessFlags()` 方法](#2. Java 20 新增:accessFlags() 方法)
    • [3. `getModifiers()` vs `accessFlags()` 对比](#3. getModifiers() vs accessFlags() 对比)
    • [4. 总结](#4. 总结)

470. Java 反射 - Member 接口与 AccessFlag

在反射 API 中,不止类(Class)有修饰符,成员元素(字段、方法、构造器)也有。


1. getModifiers() 的两处声明

  • 在 Class 类中
    用来获取类自身的修饰符(如 public、final、abstract 等)。
  • 在 Member 接口中
    Field、Method、Constructor 都实现了这个接口。
    • Field.getModifiers()
    • Method.getModifiers()
    • Constructor.getModifiers()

两者行为一致:

  • 返回一个 int,每一位代表一个修饰符。
  • 需要用 java.lang.reflect.Modifier 工具类解码。

示例

java 复制代码
import java.lang.reflect.*;

public class ModifiersDemo {
    public static void main(String[] args) throws Exception {
        Method m = String.class.getMethod("substring", int.class);
        int modifiers = m.getModifiers();

        System.out.println("Is substring public? " + Modifier.isPublic(modifiers));
        System.out.println("Is substring static? " + Modifier.isStatic(modifiers));
    }
}

输出:

java 复制代码
Is substring public? true
Is substring static? false

✅ 说明 :String.substring(int) 是 public,但不是 static。


2. Java 20 新增:accessFlags() 方法

从 Java SE 20 开始,Class 和 Member 都新增了 accessFlags() 方法。

它返回一个 Set<AccessFlag> ,比 int 修饰符更直观。

  • AccessFlag 是一个枚举,表示类、字段、方法、构造器的修饰符。
  • 比如:PUBLIC、FINAL、STATIC、ABSTRACT 等。

示例

java 复制代码
import java.lang.reflect.AccessFlag;

public class AccessFlagsDemo {
    public static void main(String[] args) {
        Class<?> c = String.class;
        var accessFlags = c.accessFlags();

        for (AccessFlag flag : accessFlags) {
            System.out.println("accessFlag = " + flag);
        }
    }
}

输出:

java 复制代码
accessFlag = PUBLIC
accessFlag = FINAL
accessFlag = SUPER

✅ 说明:

  • String 是 public 、final 的类。
  • 额外有一个 SUPER 标记 → 表示类使用了现代方法调用语义(几乎所有类编译后都会带)。

3. getModifiers() vs accessFlags() 对比

方法 返回值类型 可读性 Java 版本
getModifiers() int 位掩码 需要 Modifier 工具类解码 JDK 1.1 起
accessFlags() Set<AccessFlag> 直观、可迭代 JDK 20 起

4. 总结

  • 旧方式 :getModifiers() + Modifier.isXXX() → 需要位运算解码
  • 新方式(推荐) :accessFlags() → 返回 AccessFlag 枚举集合,更直观、更易读
  • 兼容性 :如果要写向后兼容的代码,依旧要用 getModifiers()
相关推荐
1024奇点8 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
实名上网宋凯宣8 小时前
Django
后端·python·django
Warren2Lynch9 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
天河归来9 小时前
第三方接口不稳定,如何让核心任务继续完成
java·大数据
如若12310 小时前
【论文复现】CoFailMed:从零复现医学图像分割的共享失败审计,含完整代码流程与科研绘图
人工智能·python
Knight_AL10 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
FRing0310 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
by2099911 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河11 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
视觉小萌新11 小时前
AI Class 3 · Chapter 1:变量、字符串、list/dict、if/for(python学习-小白版-有经验可跳过)
python·学习·list