Java 反射修改私有 final 字段:值改变了吗?
在给定的代码中,属性'tent'被声明为私有的、不可变的(final),并且它的初始值为字符串'123'。
通过反射机制修改'tent'的值是可行的,但由于'tent'被声明为不可变(final),因此在运行时会抛出IllegalAccessException异常,禁止修改final字段的值。
通过反射获取到的值和通过创建新对象获取到的值是不一样的,原因是final字段的值在创建对象时就被确定了,保存在对象的常量池中。通过反射机制修改'tent'字段的值,实际上是修改了对象在堆内存中的副本,而原始的final字段的值并没有改变。
'tent'存在于对象的堆内存中,作为对象的一个成员变量,每个对象都有自己的'tent'字段。
原文地址: https://www.cveoy.top/t/topic/qx2I 著作权归作者所有。请勿转载和采集!