如何通过Reflection获取LinkedList元素的Field对象并设置字段值
问题说明
我有一个存储String类型元素的LinkedList,初始化代码如下:
List<String> list = new LinkedList(); list.add("");
需求是使用Reflection(反射)获取list.get(0)对应的Field对象,并将该Field对象的值设置为"Hello",预期代码结构参考:
Field field = //the field entry of list.get(0) field.set() // set field with a string "Hello"
实现方法
LinkedList底层是双向链表结构,所有元素都封装在内部私有类Node的实例中,索引0位置的元素由LinkedList的first字段指向的头节点持有,节点内用item字段存储实际的元素值,按这个结构反射即可:
- 先获取LinkedList的
first字段,拿到头节点实例 - 拿到头节点的
item字段,这个字段就是对应list.get(0)值的Field对象 - 放开私有字段的访问权限,调用set方法修改值即可
完整实现代码:
import java.lang.reflect.Field; import java.util.LinkedList; import java.util.List; public class Test { public static void main(String[] args) throws Exception { List<String> list = new LinkedList(); list.add(""); // 获取LinkedList指向第一个节点的first字段 Field firstField = LinkedList.class.getDeclaredField("first"); firstField.setAccessible(true); Object firstNode = firstField.get(list); // 获取节点中存储实际元素的item字段,就是目标Field Field field = firstNode.getClass().getDeclaredField("item"); field.setAccessible(true); // 设置值为Hello field.set(firstNode, "Hello"); // 验证:输出Hello System.out.println(list.get(0)); } }
注意事项
- 该写法依赖标准JDK中LinkedList的内部实现,若不同JDK版本修改了内部类名、字段名,代码会抛出
NoSuchFieldException,生产环境不建议通过反射修改JDK集合类的内部状态。 - 反射访问私有字段必须提前调用
setAccessible(true)绕过访问权限检查,否则会抛出IllegalAccessException。
内容的提问来源于stack exchange,提问作者mang4521
相关产品推荐
相关产品推荐

