final修饰符大家在开发的过程中都有使用过,那么final修饰的字段能够使用反射修改吗?这个问题值得反思。针对这个问题,看如下两种情况:
情况一
代码如下:
main方法执行反射修改num2的值,结果如下:
明显这里是被修改成功了。
情况二
同样在main方法执行反射修改num2的值,结果如下:
结果这里没有修改成功。
仔细观察发现我只是修改了final修饰字段在声明的时候有没有给定初始值。给的话就反射不成功,没给的话就可以通过反射修改。这是什么原因呢? 通过查看JVM编译的字节码文件查看
情况一字节码如下:
这里编译器会将字段优化成一个常量。并且字段名称消失了
情况二字节码如下:
这里可以看到字段的名称
总结:
通过final修饰的字段在没有初始化的时候,可以通过反射进行操作,反之由于虚拟机优化的原因,不能够通过反射修改它的值。