Java反射之修改常量值
1. 通过反射修改常量的值
package com.blueStarWei.invoke;
import java.lang.reflect.Field;
public class ModifyFinalField {
private final Integer KEY_EXIT = 1024;
private static void invoke() throws Exception{
ModifyFinalField mff = new ModifyFinalField();
System.out.println("Before modifying : "+mff.KEY_EXIT);//1024
//获取属性【private final java.lang.Integer com.blueStarWei.invoke.ModifyFinalField.KEY_EXIT】
Field field = mff.getClass().getDeclaredField("KEY_EXIT");
//忽略属性的访问权限
field.setAccessible(true);
//设置新的值
field.set(mff, 512);
System.out.println("After modifying : "+mff.KEY_EXIT);//512
}
public static void main(String[] args) {
try {
invoke();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.通过反射修改静态常量的值
package com.blueStarWei.invoke; import java.lang.reflect.Field;
import java.lang.reflect.Modifier; public class ModifyFinalField { private static final Integer KEY_EXIT = 1024; private static void invoke() throws Exception{
System.out.println("Before modifying : "+ModifyFinalField.KEY_EXIT);//1024
//获取属性【private final java.lang.Integer com.blueStarWei.invoke.ModifyFinalField.KEY_EXIT】
Field field = ModifyFinalField.class.getDeclaredField("KEY_EXIT"); //忽略final修饰符【注释一】
Field modifiers = Field.class.getDeclaredField("modifiers");
modifiers.setAccessible(true);
modifiers.setInt(field, field.getModifiers()&~Modifier.FINAL);
//设置新的值
field.set(null, 512); System.out.println("After modifying : "+ModifyFinalField.KEY_EXIT);//512
} public static void main(String[] args) {
try {
invoke();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.1 注释一
public class FinalDemo {
private static final Integer KEY = 12;
public static void main(String[] args) throws NoSuchFieldException, SecurityException {
Field field = FinalDemo.class.getDeclaredField("KEY");
//getModifiers()以整数形式返回由此 Field 对象表示的字段的 Java 语言修饰符。
System.out.println("private static final : "+Integer.toBinaryString(field.getModifiers())); //private static final : 11010
System.out.println("---------------分割线-------------------");
System.out.printf("private : " + "%6s",Integer.toBinaryString(Modifier.PRIVATE) + "\n"); //private : 10
System.out.printf("static : " + "%6s",Integer.toBinaryString(Modifier.STATIC) + "\n"); //static : 1000
System.out.printf("Final : " + "%6s",Integer.toBinaryString(Modifier.FINAL) + "\n"); //Final : 10000
}
}
3.注意事项
3.1 基本数据类型和String类型的final常量在编译时,编译器会自动将用到该常量的地方用实际值替换(不管是否是静态的);而封装类型不存在该现象。
static final int A = 23;
if(i > A){
System.out.println(A);
} //自动编译成 static final int A = 23;
if(i > 23){
System.out.println(23);
}
3.2 导致的问题:即使通过反射修改了基本数据类型和String类型的final常量的值,但是使用该常量时,值仍然是原来的值。
package com.blueStarWei.invoke; import java.lang.reflect.Field;
import java.lang.reflect.Modifier; public class SpecialCase { private static final int NUM = 1024; private static void invok1() throws Exception {
System.out.println("Before modify : "+SpecialCase.NUM);//Before modify : 1024
Field field = SpecialCase.class.getDeclaredField("NUM");
field.setAccessible(true);
Field modifiers = Field.class.getDeclaredField("modifiers");
modifiers.setAccessible(true);
modifiers.setInt(field, field.getModifiers()&~Modifier.FINAL);
field.set(null, 512);
//在下一行打断点,会发现NUM的值已经变为512,但是输出的仍然是1024
System.out.println("After modify : "+SpecialCase.NUM);//After modify : 1024
} public static void main(String[] args) {
try {
invok1();
} catch (Exception e) {
e.printStackTrace();
}
}
}
更多内容,请访问:http://www.cnblogs.com/BlueStarWei/
Java反射之修改常量值的更多相关文章
- Android利用Java反射机制修改Android System Language
private void updateLanguage(Locale locale) { try { Object objIActMag, objActMagNative; Class clzIAct ...
- Java 反射修改类的常量值、静态变量值、属性值
前言 有的时候,我们需要修改一个变量的值,但变量也许存在于 Jar 包中或其他位置,导致我们不能从代码层面进行修改,于是我们就用到了下面的场景,通过反射来进行修改变量的值. 定义一个实体类 class ...
- Java反射-修改private final成员变量值,你知道多少?
大家都知道使用java反射可以在运行时动态改变对象的行为,甚至是private final的成员变量,但并不是所有情况下,都可以修改成员变量.今天就举几个小例子说明. 基本数据类型 String类型 ...
- JAVA反射改动常量,以及其局限
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/barryhappy/article/details/24442953 问题,以及一个解决方式 今天公 ...
- java反射新的应用
利用java反射动态修改运行中对象的私有final变量,不管有没有get方法获取这个私有final变量. spring aop 本质是cglib,动态代理 可以做很多事情 query.addCrite ...
- Java反射机制可以动态修改实例中final修饰的成员变量吗?
问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...
- Java反射-修改字段值, 反射修改static final修饰的字段
反射修改字段 咱们从最简单的例子到难, 一步一步深入. 使用反射修改一个private修饰符的变量name 咱们回到主题, 先用反射来实现一个最基础的功能吧. 其中待获取的name如下: public ...
- Java 常量值的数据类型
Java 常量值(也叫字面量)和变量一样,也是有数据类型的. 经常有面试题考察你对 Java 常量值数据类型的理解,如下: float a = 3.3; 问你这一行代码是否正确?答案肯定是不正确.为什 ...
- 如何修改const常量值
总结:这个跟计算机语言类别和编译器有关,本文是在linux环境下说明的. 分两种情况: 1. C语言: 2. C++语言: /*! * \Description: * \author scictor ...
随机推荐
- Android的数字选择器NumberPicker-android学习之旅(三十七)
我想说的话 今天晚上我依然在图书馆写博客,其实此刻我的没心激动而忐忑,因为明天就是足球赛的决赛,我作为主力球员压力很大,因对对方很强大,但是那又怎么样.so what...我不会停止写博客的 Numb ...
- Ext JS 6应用程序Build后出现“c is not a constructor return new c(a[0])”的处理
概述 在对Ext JS 6的应用程序打包后,时不时会出现以下错误: 由于是压缩后出现的错误,要进行调试也无从下手,因而这个错误会令新手手足无措,不知道是怎么回事. 错误原因 造成该错误的主要原因是要创 ...
- UNIX环境高级编程——管道和FIFO的额外属性
一个描述符能以两种方式设置成非阻塞. (1)调用open时可以指定O_NONBLOCK标志. writefd = open(FIFO1,O_WRONLY | O_NONBLOCK,0); (2)如果一 ...
- WIP完工入库及完工退回的几个重要问题
1.必须向CST_COMP_SNAP_INTERFACE表中插入此工单所有工序的数据(也就是说同样的工单插入多条,只是工序号不一样) 标准文档: Note: If there are multiple ...
- EFI怎么装系统? UEFI BIOS
关于EFI的介绍,就不赘述了. 大家可以看看这个帖子 http://benyouhui.it168.com/thread-2488583-1-1.html 总之,新电脑都是这玩意,win8也做了相应E ...
- 【翻译】将Ext JS Grid转换为Excel表格
原文:Converting an Ext 5 Grid to Excel Spreadsheet 稍微迟来的礼物--Ext JS Grid转为Excel代码,现在支持Ext JS 5! 功能包括: - ...
- Linux Shell 只列出目录的方法
在实际应用中,我们有时需要仅列出目录,下面是 4 种不同的方法. 1. 利用 ls 命令的 -d 选项: $ ls -d */ Desktop/ pic/ shell/ src/ 2. 利用 ls 命 ...
- Android群英传笔记——第七章:Android动画机制和使用技巧
Android群英传笔记--第七章:Android动画机制和使用技巧 想来,最 近忙的不可开交,都把看书给冷落了,还有好几本没有看完呢,速度得加快了 今天看了第七章,Android动画效果一直是人家中 ...
- 【Qt编程】Qt 小时钟
Hello World! 学习编程语言的最简单最经典的小程序,当然Qt也不例外.在学习画图时,我觉得写个时钟小程序也是个比较好的开始.在之前的<Matlab及Java小时>一文中,我也从写 ...
- OpenCV轮廓检测,计算物体旋转角度
效果还是有点问题的,希望大家共同探讨一下 // FindRotation-angle.cpp : 定义控制台应用程序的入口点. // // findContours.cpp : 定义控制台应用程序的入 ...