推荐使用 Modifier.isStatic() 和 Modifier.isTransient() 判断字段修饰符,因其语义明确、可读性高;手动位运算仅用于理解原理或复杂组合判断,需注意 transient 仅适用于字段且 getModifiers() 返回位或值。

直接用 Modifier 提供的静态判断方法最稳妥,也最清晰。
用 Modifier.isStatic() 和 Modifier.isTransient() 判断
这是推荐做法。Java 的 java.lang.reflect.Modifier 类封装了位运算细节,提供语义明确的布尔方法:
-
Modifier.isStatic(field.getModifiers())→ 返回true表示字段含static -
Modifier.isTransient(field.getModifiers())→ 返回true表示字段含transient
这两个方法内部就是做按位与(&)运算,但你无需手动算二进制或整数值,代码可读性高、不易出错。
手动按位与判断(了解原理用)
如果你需要理解底层机制或做组合判断(比如“是 static 且不是 transient”),可以手动用位运算:
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 判断是否含
static:(field.getModifiers() & Modifier.STATIC) != 0 - 判断是否含
transient:(field.getModifiers() & Modifier.TRANSIENT) != 0 - 判断**仅含**
static(不含其他修饰符):field.getModifiers() == Modifier.STATIC - 判断同时含
static和transient:(field.getModifiers() & (Modifier.STATIC | Modifier.TRANSIENT)) == (Modifier.STATIC | Modifier.TRANSIENT)
注意:不能用 == Modifier.STATIC 来判断“是否为 static”,因为字段可能还带 public 或 final 等;只有确认是单一修饰符时才适用相等判断。
常见误区提醒
几个容易踩的坑:
-
transient只对字段有效,不能用于方法或类,所以Modifier.isTransient()只应在Field上调用 -
getModifiers()返回的是所有修饰符的**位或结果**,不是枚举或字符串,不能直接.toString()或equals("static") - 不要混淆
getDeclaredFields()和getFields():前者能拿到 private/transient 字段,后者只返回 public 字段(且不保证含 transient)
实际使用小例子
遍历一个类的所有字段,筛选出 static transient 字段:
for (Field f : clazz.getDeclaredFields()) {
int mods = f.getModifiers();
if (Modifier.isStatic(mods) && Modifier.isTransient(mods)) {
System.out.println("找到 static transient 字段:" + f.getName());
}
}这样写既准确又符合 Java 开发惯例。

















