Java反射中判断字段是否为静态需用Modifier.isStatic(mods),判断常量需先满足public static final修饰符组合,再验证是否为编译期常量(如基本类型或String字面量)。

Java 反射中判断字段是否为静态(static)或常量(通常指 public static final 基本类型/字符串),核心是通过 Field 对象的修饰符(modifiers)结合 Modifier 工具类进行位运算解析。
用 Modifier.isStatic() 判断是否为静态字段
Field.getModifiers() 返回一个整数,它本质是所有修饰符对应的二进制标志位的“或”结果。要判断是否含 static,不能直接比数值,而要用 Modifier.isStatic(int mod) —— 它内部做了 (mod & STATIC) != 0 的按位与判断。
Field f = clazz.getDeclaredField("count");int mods = f.getModifiers();boolean isStatic = Modifier.isStatic(mods); // true 表示是 static 字段
判断是否为常量(public static final + 编译期常量)
Java 中“常量”在反射语境下通常指满足两个条件的字段:public static final,且其值是编译期常量(如基本类型、String 字面量)。仅靠修饰符无法 100% 确认是否为编译期常量,但可先筛修饰符组合:
boolean isConstantCandidate = Modifier.isPublic(mods) && Modifier.isStatic(mods) && Modifier.isFinal(mods);- 若为
true,再进一步检查类型和值(例如f.getType()是int.class或String.class,且f.get(null)不抛异常) - 注意:
private static final int X = 1;也是编译期常量,但因非 public,一般不对外暴露为“常量”,反射中仍可通过setAccessible(true)读取
常见修饰符组合速查表
以下常用修饰符可通过 Modifier.toString(int) 直观查看,也可用位运算组合判断:
立即学习“Java免费学习笔记(深入)”;
-
static→Modifier.isStatic(mods) -
final→Modifier.isFinal(mods) -
public→Modifier.isPublic(mods) -
private→Modifier.isPrivate(mods) -
protected→Modifier.isProtected(mods) - 组合判断(如 public static)→
Modifier.isPublic(mods) && Modifier.isStatic(mods)
实际使用时的注意事项
获取修饰符前需注意访问权限:
- 默认只返回
public成员(包括父类继承的),如需私有字段,必须调用clazz.getDeclaredField(...)并配合f.setAccessible(true) -
getDeclaredXXX()系列方法才能拿到本类定义的所有字段(含 private/static/final),getFields()只返回 public 字段 - 对
final字段反射赋值(f.set(obj, newValue))在 JDK 9+ 默认受限,需额外权限或关闭安全检查


















