验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

怎样遍历Field字段

阅读:603 来源:乙速云 作者:代码code

怎样遍历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());
    }
}

七、常见注意点

  1. private 字段必须
    field.setAccessible(true);
    
  2. 静态字段取值:
    field.get(null);
    
  3. 性能问题:反射比直接访问慢,不适合高频循环

八、总结对照表

方法 是否含 private 是否含父类
getDeclaredFields()
getFields() ✅(仅 public)
递归 getSuperclass()

如果你指的是 某个具体框架(如 MyBatis、Spring、Jackson)里的 Field 遍历,或者 Kotlin / Android / 泛型字段,可以告诉我具体场景,我可以给你更精准的示例。

分享到:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
下一篇: Field字段能final吗
相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>