You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:57:11