举例代码如下:
//String 会被 JVM 优化private final String FINAL_VALUE = "http://www.kingceram.com/post/FINAL";public String getFinalValue(){//剧透,会被优化为: return "FINAL" ,拭目以待吧return FINAL_VALUE;}
/*** 修改对象私有常量的值* 为简洁代码,在方法上抛出总的异常,实际开发别这样*/private static void modifyFinalFiled() throws Exception {//1. 获取 Class 类实例TestClass testClass = new TestClass();Class mClass = testClass.getClass();//2. 获取私有常量Field finalField = mClass.getDeclaredField("FINAL_VALUE");//3. 修改常量的值if (finalField != null) {//获取私有常量的访问权finalField.setAccessible(true);//调用 finalField 的 getter 方法//输出 FINAL_VALUE 修改前的值System.out.println("Before Modify:FINAL_VALUE = "http://www.kingceram.com/post/+ finalField.get(testClass));//修改私有常量finalField.set(testClass,"Modified");//调用 finalField 的 getter 方法//输出 FINAL_VALUE 修改后的值System.out.println("After Modify:FINAL_VALUE = "http://www.kingceram.com/post/+ finalField.get(testClass));//使用对象调用类的 getter 方法//获取值并输出System.out.println("Actually :FINAL_VALUE = "http://www.kingceram.com/post/+ testClass.getFinalValue());}}
打印结果如下:
Before Modify:FINAL_VALUE = http://www.kingceram.com/post/FINALAfter Modify:FINAL_VALUE = ModifiedActually :FINAL_VALUE = FINAL
如果要保证反射修改的常量值在运行过程中是有效的,可以尝试在常量初始阶段不对其进行赋值,利用构造函数对其进行复制 。
因为在利用构造函数对其进行赋值时,常量在JVM虚拟机的优化下并不会直接指向具体的值,而是指向常量本身
如下:
【一、Java反射机制具体是什么】四、反射优缺点 优点缺点总结
- 一岁半宝宝早教100例,一岁半宝宝早教
- 一年泰迪狗怎样喂养,泰迪犬怎么喂养
- 百强房企排名,有些房企看上去很有钱,却一直做不大,这是为什么?
- 一岁的宝宝腰没劲怎么训练,1岁半宝宝拉肚子怎么办
- 一天中什么时候取手镯,银手镯变黑后用牙膏洗了不到一天又变黑是什么原因
- 一年的税单怎么打,地税打零税单怎么打?
- 一天吃阿胶最佳时间,阿胶在一天的什么时间吃最佳?
- 一夜之间学渣变学霸的方法,如何一夜之间变学霸
- 一嘴的黄牙能洗白吗,黄牙能洗白吗
- 一天卖50碗麻辣烫挣多少钱,麻辣烫一天卖多少碗才能赚钱