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()
相关推荐
宿州派大星2 小时前
Python实战:PyQt5 + OpenCV + Dlib 打造AI桌面应用
人工智能·python·qt
承渊政道3 小时前
【从零开始大模型开发与微调:基于PyTorch与ChatGLM】(开源大模型ChatGLM高级定制化应用实战)
人工智能·pytorch·python·llm·模型微调·glm
Joy T5 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
m0_587383007 小时前
广州 24 小时自助健身房解决方案技术实现与实战指南
java·spring·小程序·架构·需求分析
·云扬·8 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
专注仿真8 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
Best-Wishes8 小时前
科来网络分析系统(技术交流版)使用说明书
开发语言·junit·php
代码不停9 小时前
自动化测试(java)
java·开发语言·selenium·自动化
Smoothcloud润云9 小时前
PyTorch大模型权重加载与启动耗时优化实战:定位磁盘、内存与显存瓶颈
人工智能·pytorch·python·深度学习·gpu算力
databook9 小时前
从循环到向量化:NumPy提速的7个关键思维
python·数据分析·numpy