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()
相关推荐
苏灿烤鱼21 分钟前
把 Agent 做成一家公司,真比通用提示词好用吗?
python·agent·shell
程序员黑豆7 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
wuyk5558 小时前
第2章:六步换相原理全解+STM32工程实战
c语言·开发语言·stm32·单片机·嵌入式硬件
hey_sml8 小时前
JAVA每日一学---CompletableFuture中thenApply与thenCompose区别详解
java·开发语言
Doraemomo8 小时前
数据结构-环形链表
java·数据结构·链表
萧瑟余晖10 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
北斗落凡尘10 小时前
LangGraph 入门实战(2)
python·langchain
是未才10 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio10 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
萧瑟余晖11 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring