field.setAccessible(true)的作用

本文探讨了Java中field.setAccessible(true)的方法,它允许访问private变量的值。通过示例代码展示了设置为true和false时的不同效果:true可获取变量名和值,而false仅能获取变量名,尝试获取值会引发IllegalAccessException。此外,还提到setAccessible(true)对提升反射效率的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

field.setAccessible(true) 设置可以访问private变量的变量值

下面代码演示:
1.当设置 f.setAccessible(true);

public class User {
    private String name;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public class Demo {
    public static void main(String[] args) throws Exception {
        Class clazz = User.class;
        User u = new User("小明");
        for (Field f : clazz.getDeclaredFields()) {
            System.out.println(f.isAccessible());//这里的结果是false
            f.setAccessible(true);
            System.out.println(f.getName());
            System.out.println(f.get(u));
        }
    }
}

运行结果:
f.setAccessible(true); 可以获取变量名 和 变量的值

false
name
小明

Process finished with exit code 0

2.当设置 f.setAccessible(false);

public class Demo {
    public static void main(String[] args) throws Exception {
        Class clazz = User.class;
        User u = new User("小明");
        for (Field f : clazz.getDeclaredFields()) {
            System.out.println(f.isAccessible());//这里的结果是false
            f.setAccessible(false);
            System.out.println(f.getName());
            System.out.println(f.get(u));
        }
    }
}

运行结果:
f.setAccessible(false); 可以获取变量名, 但是变量的值获取就抛IllegalAccessException异常了, 抛异常的代码: System.out.println(f.get(u));

false
name
Exception in thread "main" java.lang.IllegalAccessException: Class com.sndn.jdk18_test.Demo can not access a member of class com.sndn.jdk18_test.User with modifiers "private"
	at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
	at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)
	at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)
	at java.lang.reflect.Field.get(Field.java:390)
	at com.sndn.jdk18_test.Demo.main(Demo.java:13)

Process finished with exit code 1

结论:

  1. f.setAccessible(true); 可以获取变量名 和 变量的值.
  2. f.setAccessible(false); 可以获取变量名, 但是变量的值获取就抛IllegalAccessException异常.
  3. f.setAccessible(true);其实还可以提示反射的效率.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值