一、Java反射机制具体是什么( 四 )


举例代码如下:
//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反射机制具体是什么】四、反射优缺点 优点缺点总结