怎样遍历Field字段
在 Java 里,“遍历 Field 字段”通常指 反射(Reflection)遍历一个类的成员变量。下面按常见场景给你总结几种做法。
一、遍历当前类声明的字段(不含父类)
import java.lang.reflect.Field;
public class Test {
private int a;
protected String b;
public double c;
public static void main(String[] args) {
Field[] fields = Test.class.getDeclaredFields();
for (Field field : fields) {
System.out.println("字段名: " + field.getName());
System.out.println("类型: " + field.getType());
System.out.println("修饰符: " + field.getModifiers());
}
}
}
✅ getDeclaredFields()
- 包含
private / protected / public - 不包含父类字段
二、遍历包含父类的所有 public 字段
Field[] fields = Test.class.getFields();
⚠️ 只能拿到:
public字段- 包括父类中的
public字段
三、递归遍历当前类 + 所有父类的字段(最常用)
public static void printAllFields(Class> clazz) {
while (clazz != null) {
for (Field field : clazz.getDeclaredFields()) {
System.out.println(clazz.getName() + " -> " + field.getName());
}
clazz = clazz.getSuperclass();
}
}
调用:
printAllFields(Child.class);
✅ 适合 ORM、序列化、拷贝对象等场景
四、遍历并访问字段值(实例对象)
Test obj = new Test();
obj.a = 10;
Field field = Test.class.getDeclaredField("a");
field.setAccessible(true); // 访问 private 字段
Object value = field.get(obj);
System.out.println(value); // 10
五、遍历并修改字段值
field.set(obj, 20);
六、按注解过滤字段(非常常见)
for (Field field : Test.class.getDeclaredFields()) {
if (field.isAnnotationPresent(MyAnnotation.class)) {
System.out.println(field.getName());
}
}
七、常见注意点
- private 字段必须
field.setAccessible(true); - 静态字段取值:
field.get(null); - 性能问题:反射比直接访问慢,不适合高频循环
八、总结对照表
| 方法 | 是否含 private | 是否含父类 |
|---|---|---|
getDeclaredFields() |
✅ | ❌ |
getFields() |
❌ | ✅(仅 public) |
递归 getSuperclass() |
✅ | ✅ |
如果你指的是 某个具体框架(如 MyBatis、Spring、Jackson)里的 Field 遍历,或者 Kotlin / Android / 泛型字段,可以告诉我具体场景,我可以给你更精准的示例。