详解Java的getFields()方法:返回一个包含 Field 对象的数组

  • Post category:Java

Java中的getFields()方法是反射机制中的一个方法,它可以获取一个类当中的所有public字段,包括父类中的public字段。使用该方法需要注意以下几点:

  1. 只能获取public字段
  2. 只能获取字段,无法获取方法和构造器
  3. 获取到的字段是一个数组,可以通过遍历获取字段的相关信息

下面是该方法的使用示例:

public class Demo {
    public static void main(String[] args) {
        // 获取Person类中的public字段
        Field[] fields = Person.class.getFields();
        for (Field field : fields) {
            System.out.println(field.getName()); // 输出字段名字
            System.out.println(field.getType()); // 输出字段的数据类型
        }
    }
}

class Person {
    public int age;
    public String name;
}

上面的示例中,我们先定义了一个Person类,其中包含两个public字段age和name。在Demo类中使用getFields()方法获取Person类中的public字段,然后把获取到的字段信息打印出来。

这里需要注意的是,由于Person类中只有public字段,所以能够获取到的所有字段就是age和name。如果Person类中还有private或protected字段,那么getFields()方法是无法获取到的。

下面再来看一个稍微复杂一点的示例,我们在一个类中定义了多个嵌套的内部类,并使用getFields()方法分别获取它们中的public字段:

public class Demo {
    public static void main(String[] args) {
        // 获取Demo类中所有public字段
        Field[] fields = Demo.class.getFields();
        for (Field field : fields) {
            System.out.println(field.getDeclaringClass().getSimpleName() + "." + field.getName());
        }

        // 获取Demo类中Nested1类中所有public字段
        fields = Demo.Nested1.class.getFields();
        for (Field field : fields) {
            System.out.println(field.getDeclaringClass().getSimpleName() + "." + field.getName());
        }

        // 获取Demo类中Nested2类中的所有public字段
        fields = Demo.Nested2.class.getFields();
        for (Field field : fields) {
            System.out.println(field.getDeclaringClass().getSimpleName() + "." + field.getName());
        }
    }

    public static class Nested1 {
        public int i;
        public String s;
    }

    public static class Nested2 {
        public boolean b;
        public double d;
    }

    public int x;
    public String str;
}

上面的示例中,我们首先使用getFields()方法获取Demo类中的public字段,然后再分别使用getFields()方法获取Demo类中的两个内部类Nested1和Nested2中的public字段。在获取每个字段时,我们使用getDeclaringClass()方法获取该字段所属的类,并使用getSimpleName()方法获取类的简单名字,然后再将字段名字和类名拼接起来,打印出来。

需要注意的是,在获取Nested1和Nested2类的public字段时,我们是通过类名Demo.Nested1和Demo.Nested2来获取的。这是因为这两个类是Demo类的内部类,必须使用外部类与内部类的组合类名来获取内部类中的public字段。如果这些类都是独立的Top-Level类,那么可以直接使用类名来获取它们中的public字段。