471. Java 反射 - Field 对象
2026/7/22 23:31:03 网站建设 项目流程

文章目录

  • 471. Java 反射 - Field 对象
    • 1. 如何定位字段 (Locating Fields)
    • 2. 示例:打印 `ArrayList` 的所有字段
      • 输出示例
    • 3. 示例:获取 `ArrayList` 的所有 **public 字段**
      • 输出
    • 4. 总结

471. Java 反射 - Field 对象

在反射 API 中,Field对象表示类中的一个成员变量。
通过Field我们可以:

  • 获取字段的类型修饰符声明位置
  • 读取对象中该字段的值
  • 修改该字段的值(即使是private,只要设置可访问)
  • 列出一个类的所有字段

1. 如何定位字段 (Locating Fields)

Class提供了四组方法来查找字段:

方法返回单个字段/数组是否包含继承字段是否包含私有字段
getDeclaredField(String)单个字段❌ 不包含继承✅ 包含私有
getField(String)单个字段✅ 包含继承❌ 仅 public
getDeclaredFields()数组❌ 不包含继承✅ 包含私有
getFields()数组✅ 包含继承❌ 仅 public

📌口诀

  • Declared→ 当前类声明的字段(包含私有的)。
  • 不带 Declared→ 只看 public 字段,但会包含父类的。

2. 示例:打印ArrayList的所有字段

importjava.lang.reflect.*;importjava.util.*;publicclassFieldDemo{publicstaticvoidmain(String[]args)throwsException{Class<?>arrayListClass=Class.forName("java.util.ArrayList");Field[]fields=arrayListClass.getDeclaredFields();Arrays.stream(fields).forEach(field->System.out.println("Field: "+field.getName()+" declared in "+field.getDeclaringClass().getSimpleName()+" "+Modifier.toString(field.getModifiers())));}}

输出示例

Field:serialVersionUID declared inArrayListprivatestaticfinalField:DEFAULT_CAPACITYdeclared inArrayListprivatestaticfinalField:EMPTY_ELEMENTDATAdeclared inArrayListprivatestaticfinalField:DEFAULTCAPACITY_EMPTY_ELEMENTDATAdeclared inArrayListprivatestaticfinalField:elementData declared inArrayListtransientField:size declared inArrayListprivateField:MAX_ARRAY_SIZEdeclared inArrayListprivatestaticfinal

说明

  • 我们获取到ArrayList自己声明的所有字段(包括privatestatic等)。
  • 没有包含父类的字段。

3. 示例:获取ArrayList的所有public 字段

Class<?>arrayListClass=Class.forName("java.util.ArrayList");Field[]fields=arrayListClass.getFields();System.out.println("Public fields for ArrayList: "+fields.length);

输出

PublicfieldsforArrayList:0

说明

  • ArrayList及其父类(如AbstractListAbstractCollectionObject)都没有public字段。
  • 因此结果为0

4. 总结

  • getDeclaredFields()→ 当前类,所有字段(含私有)。
  • getFields()→ 当前类 + 父类,仅 public 字段
  • 字段的更多操作包括:
    • 读取值field.get(obj)
    • 写入值field.set(obj, newValue)
    • 突破私有访问field.setAccessible(true)(需注意安全风险)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询