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 类中
    用来获取类自身的修饰符(如 publicfinalabstract 等)。
  • Member 接口中
    FieldMethodConstructor 都实现了这个接口。
    • 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 开始,ClassMember 都新增了 accessFlags() 方法。

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

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

示例

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

说明

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

3. getModifiers() vs accessFlags() 对比

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

4. 总结

  • 旧方式getModifiers() + Modifier.isXXX() → 需要位运算解码
  • 新方式(推荐)accessFlags() → 返回 AccessFlag 枚举集合,更直观、更易读
  • 兼容性 :如果要写向后兼容的代码,依旧要用 getModifiers()
相关推荐
小羊没烦恼!1 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
默_笙1 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
俊昭喜喜里1 天前
java中的继承和多态的区别
java
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003961 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
譕痕1 天前
JSONObject与JSONArray封装数据格式区别
java·json
虎头金猫1 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
胡写代码1 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖1 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
长沙三为智能科技1 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python