1、思路
在java语法中,final变量是不允许修改的,在JVM执行引擎执行时,如果某个变量的修饰符是final的,那么JVM执行引擎就会报错,因此,变量的final修饰符是关键。
简单来说,我们通过反射,拿到某个属性的Field对象,再将Field对象中的修饰符modifiers
修改成非final,最后再调用反射去修改就可以成功了。
2、实现
先上代码:
1 | import java.lang.reflect.Field; |
输出将会是:
1 | 100 |
注:代码中用到了ReflectionUtils
类,这是从Spring拷贝出来的一个工具类,它没有依赖Spring任何其他的工具类,因此拷贝出来当自己的工具。后文粘贴了源码。
可以看到,上面代码
- 第一步先将name字段获取出来,拿到Field对象;
- 再将Field对象的
modifiers
字段拿到,并且将Final修饰符去掉; - 最后将name字段重新赋值,赋值成功。
3、依赖的工具类
为了使代码看起来更简洁,上面的代码使用了Spring的一个反射工具类ReflectionUtils
,由于该工具类没有依赖其他的类,可以说这个工具类非常“纯洁”,我们可以将这个工具类的源代码拷贝出来自己用。
源代码如下:
1 |
|