
文章目录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)单个字段✅ 包含继承❌ 仅 publicgetDeclaredFields()数组❌ 不包含继承✅ 包含私有getFields()数组✅ 包含继承❌ 仅 public口诀Declared→ 当前类声明的字段包含私有的。不带 Declared→ 只看 public 字段但会包含父类的。2. 示例打印ArrayList的所有字段importjava.lang.reflect.*;importjava.util.*;publicclassFieldDemo{publicstaticvoidmain(String[]args)throwsException{Class?arrayListClassClass.forName(java.util.ArrayList);Field[]fieldsarrayListClass.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自己声明的所有字段包括private、static等。没有包含父类的字段。3. 示例获取ArrayList的所有public 字段Class?arrayListClassClass.forName(java.util.ArrayList);Field[]fieldsarrayListClass.getFields();System.out.println(Public fields for ArrayList: fields.length);输出PublicfieldsforArrayList:0✅说明ArrayList及其父类如AbstractList、AbstractCollection、Object都没有public字段。因此结果为0。4. 总结getDeclaredFields()→ 当前类所有字段含私有。getFields()→ 当前类 父类仅 public 字段。字段的更多操作包括读取值field.get(obj)写入值field.set(obj, newValue)突破私有访问field.setAccessible(true)需注意安全风险