文章目录
- [470. Java 反射 - Member 接口与 AccessFlag](#470. Java 反射 - Member 接口与 AccessFlag)
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()