温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java Private 私有字段怎么反射

发布时间:2026-07-24 02:30:59 来源:亿速云 阅读:96 作者:小樊 栏目:编程语言

在 Java 中,private 字段可以通过反射(Reflection)访问和修改,核心是使用
Class.getDeclaredField(...) + setAccessible(true)

下面从获取、读取、修改、注意事项几个方面说明。


一、基本示例

1️⃣ 目标类(含 private 字段)

public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

2️⃣ 反射访问 private 字段

import java.lang.reflect.Field;

public class ReflectTest {
    public static void main(String[] args) throws Exception {
        User user = new User("Tom", 18);

        // 获取 Class 对象
        Class<?> clazz = user.getClass();

        // 获取 private 字段
        Field nameField = clazz.getDeclaredField("name");

        // 解除私有限制(关键步骤)
        nameField.setAccessible(true);

        // 读取字段值
        String nameValue = (String) nameField.get(user);
        System.out.println(nameValue); // Tom

        // 修改字段值
        nameField.set(user, "Jerry");
        System.out.println(nameField.get(user)); // Jerry
    }
}

二、访问 private static 字段

class Config {
    private static int version = 1;
}
Field field = Config.class.getDeclaredField("version");
field.setAccessible(true);

int v = (int) field.get(null); // static 字段,get 传 null
System.out.println(v);

field.set(null, 2);

三、常见 API 说明

方法 说明
getDeclaredField(name) 获取本类声明的字段(含 private)
getField(name) 只能获取 public 字段
setAccessible(true) 取消 Java 语言访问检查
get(obj) 获取字段值
set(obj, value) 设置字段值

四、访问 private final 字段(⚠️)

final 字段可以反射修改,但不推荐,可能导致未定义行为。

Field field = obj.getClass().getDeclaredField("id");
field.setAccessible(true);
field.set(obj, 999);

⚠️ 注意:

  • JIT、内联优化可能让修改“看起来没生效”
  • 在 security manager 或模块系统下可能失败

五、模块系统(Java 9+)限制

如果你在 Java 9+ 中反射访问 JDK 或模块内 private 字段,可能会看到:

InaccessibleObjectException

解决方式(不推荐生产使用):

--add-opens java.base/java.lang=ALL-UNNAMED

六、总结一句话

Java private 字段反射三步走:

Field field = clazz.getDeclaredField("fieldName");
field.setAccessible(true);
field.get(obj) / field.set(obj, value);

如果你有具体场景(如 Spring、Android、Kotlin、序列化、框架源码),我可以给你更贴近实战的示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI