getDeclaredFields()
和 getFields()
是 Java 中 Class
类的两个方法,它们都用于获取类的字段信息,但它们之间存在一些重要区别:
-
获取范围:
getDeclaredFields()
:此方法仅返回当前类中声明的字段(包括私有、受保护、默认访问权限和公共字段),不包括继承自父类的字段。getFields()
:此方法返回当前类及其所有父类中声明的字段,包括继承自父类的字段。
-
访问权限:
getDeclaredFields()
:由于它仅返回当前类中声明的字段,因此可以获取所有访问权限的字段,包括私有字段。getFields()
:由于它返回当前类及其所有父类中声明的字段,因此可能无法获取某些私有字段,具体取决于父类中的访问权限。
-
返回类型:
- 两者都返回
Field
对象的数组。
- 两者都返回
-
用途:
- 当你只需要获取当前类中声明的字段信息时,可以使用
getDeclaredFields()
。 - 当你需要获取当前类及其所有父类中声明的字段信息时,可以使用
getFields()
。
- 当你只需要获取当前类中声明的字段信息时,可以使用
示例:
public class MyClass { private String privateField; protected String protectedField; public String publicField; } public class Main { public static void main(String[] args) throws NoSuchFieldException { Class> clazz = MyClass.class; // 使用 getDeclaredFields() 获取当前类中声明的字段 Field[] declaredFields = clazz.getDeclaredFields(); System.out.println("Declared fields:"); for (Field field : declaredFields) { System.out.println(field.getName()); } // 使用 getFields() 获取当前类及其所有父类中声明的字段 Field[] fields = clazz.getFields(); System.out.println("\nFields:"); for (Field field : fields) { System.out.println(field.getName()); } } }
输出:
Declared fields: privateField protectedField publicField Fields: privateField protectedField publicField