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()
相关推荐
groundhappy2 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
做个文艺程序员2 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus
小钻风33663 小时前
Spring Boot 文件上传详解:深入理解 MultipartFile 的使用与原理
java·开发语言
培之3 小时前
RTX 5090 安装 pytorch3d
人工智能·pytorch·python
其美杰布-富贵-李3 小时前
Spring Boot 工程开发全流程说明
java·spring boot·后端
Metaphor6923 小时前
使用 Python 在 PowerPoint 中创建折线图和条形图
python·信息可视化·powerpoint·图表
qq_452396234 小时前
第二篇:《Go 开发环境搭建:SDK、IDE、Module 与 Hello World》
开发语言·ide·golang
m沐沐4 小时前
【深度学习】卷积神经网络 数据增强、保存最优模型实现,详细解读
人工智能·python·深度学习·机器学习·cnn·数据增强
天青色等烟雨..4 小时前
全流程ArcGISPro空间分析、三维建模、可视化及Python融合应用技术
开发语言·python