Java中反射修改类的常量值、静态变量值-创新互联
今天就跟大家聊聊有关Java中反射修改类的常量值、静态变量值,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
成都做网站、网站建设介绍好的网站是理念、设计和技术的结合。创新互联拥有的网站设计理念、多方位的设计风格、经验丰富的设计团队。提供PC端+手机端网站建设,用营销思维进行网站设计、采用先进技术开源代码、注重用户体验与SEO基础,将技术与创意整合到网站之中,以契合客户的方式做到创意性的视觉化效果。定义一个实体类
class Bean{ private static final Integer INT_VALUE = 100; }
利用反射修改私有静态常量方法
System.out.println(Bean.INT_VALUE); Field field = Bean.class.getField("INT_VALUE"); //将字段的访问权限设为true:即去除private修饰符的影响 field.setAccessible(true); //去除final修饰符的影响,将字段设为可修改的 Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); //把字段值设为200 field.set(null, 200); System.out.println(Bean.INT_VALUE);
修改私有静态常量测试结果
100
200
看到测试结果说明我们的反射修改成功了。
利用反射修改共有静态变量方法
class Bean{ public static int nums = 100; } System.out.println(Bean.nums); Field field = Bean.class.getField("nums"); field.set(null, 200); System.out.println(Bean.INT_VALUE);
测试结果修改成功。
100
200
奇怪的地方
注意到上述代码的中的静态常量类型是Integer,但是我们项目中实际需要修改的字段类型并不是包装类型Integer,而是java的基本类型int。
当把常量的类型改成int之后。
class Bean{ private static final int INT_VALUE = 100;//把类型由Integer改成了int }
在其他代码都不变的情况下,代码输出的结果竟然变成了诡异的:
100
100
而且在调试的过程中发现,在第二次输出的时候,内存中的Bean.INT_VALUE是已经变成了200,但是System.out.println(Bean.INT_VALUE)输出的结果却依然时诡异的100?!
是反射失效了吗?
又试了其他几种类型,发现这种貌似失效的情会发生在int、long、boolean以及String这些基本类型上,而如果把类型改成Integer、Long、Boolean这种包装类型,或者其他诸如Date、Object都不会出现失效的情况。
奇怪的原因
对于基本类型的静态常量,JAVA在编译的时候就会把代码中对此常量中引用的地方替换成相应常量值。
参考:Modifying final fields in Java
即对于常量 public static final int maxFormatRecordsIndex = 100
if( index > maxFormatRecordsIndex ){ index = maxFormatRecordsIndex ; }
这段代码在编译的时候已经被java自动优化成这样的:
if( index > 100){ index = 100; }
所以在INT_VALUE是int类型的时候。
System.out.println(Bean.INT_VALUE);
编译时会被优化成下面这样:
System.out.println(100);
所以,自然,无论怎么修改Boolean.INT_VALUE,System.out.println(Bean.INT_VALUE)都还是会依然固执地输出100了。
看完上述内容,你们对Java中反射修改类的常量值、静态变量值有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。
网站栏目:Java中反射修改类的常量值、静态变量值-创新互联
网页地址:http://cdiso.cn/article/gcdpo.html