通过反射修改 被 private final static修饰的成员
来源:互联网 发布:数据恢复大师注册机 编辑:程序博客网 时间:2024/05/19 22:52
package newFeatures8;import java.lang.reflect.Field;import java.lang.reflect.Modifier;public class ModifierValue {public static void main(String[] args) throws Exception {Person1.main(args);}} class Person1 { public static void main(String[] args) throws Exception { Person1 p = new Person1(); //getDeclaredField(String name) 获取指定成员对象不论修饰符 //返回的包含指定成员对象信息的一个Field类 Field field = p.getClass().getDeclaredField("NAME"); /* Field[] fields=field.getClass().getDeclaredFields(); for (Field field2 : fields) {System.out.println(field2.getName());打印结果为: clazzslotnametypemodifierssignaturegenericInfoannotationsfieldAccessoroverrideFieldAccessorrootdeclaredAnnotations }*/ //获取该成员权限修饰符对象 Field modifiers = field.getClass().getDeclaredField("modifiers"); modifiers.setAccessible(true);//设置为可访问 //将字段的值设置为指定对象上的一个 int值 //对于使用 final static 修饰的成员可以先去掉final修饰符的影响 //field.getModifiers() & ~Modifier.FINAL:作用是去掉final修饰符的影响 modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL); //如果此字段对象强制执行java语言访问控制并且基础字段是不可访问的(private),或是最终的(final) /*If the underlying field is final, the method throws an IllegalAccessException unless setAccessible(true) has succeeded for this Field object and the field is non-static*/ //大意是:如果字段被final修饰而且是非static的除非先调用了setAccessible(true) 否则抛异常 field.set(p,"Hello"); //field.set(p,4.0); System.out.println(field.get(p)); p.printName(); } //private static final Double NAME=3.0; //常量赋值,受字符串常量池影响,反射修改值失败 // private static final String NAME="Clive";//都忘了String 本身就是final的 //动态赋值,不受字符串常量池影响,反射修改值成功 private final static String NAME=(null!=null?"":"Clive"); public Person1() {}//构造函数优先于成员变量,而静态变量又优先于构造函数 public void printName() { //由于字符串常量池的存在:虚拟机优化成 System.out.println("Clive"); System.out.println(NAME); }} enum Coin{ A(1),B(2),C(3),D(4);//A等价于A(),A{}等价于A(){},而这种写法就是匿名子类 private int value=0; private Coin(int value){this.value=value; } private Coin(){ } public int getValue(){ return value; } } //使用枚举写单例 enum Singleton{//INSTANCE等价于INSTANCE(),INSTANCE{}等价于INSTANCE(){},而这种写法就是匿名子类 INSTANCE; //定义为final就不能修改其引用,所以不能为final //定义为static就不能在构造函数中分配空间,所以不能定义为static private Person1 p=null; private Singleton(){p=new Person1();} public Person1 getInstance(){ return p; } }
阅读全文
0 0
- 通过反射修改 被 private final static修饰的成员
- 在Android中使用反射获取并修改private static final成员
- private static final 修饰符
- private final static ×× 和private static final xx 两者修饰变量的区别
- private修饰的成员方法默认是final型的?
- 谈一谈我眼中的常见修饰符(private,final,static)
- 利用反射对修饰符为final的成员变量进行修改
- 被static修饰的成员变量可以被修改吗
- java 反射机制修改private final变量
- public protected default private static final这几个修饰符的区别
- 修饰符(public、private、static、final)简单理解
- Java修饰符:private、default、protected、public、static、abstact、final
- 利用反射机制操作私有成员变量(private修饰的变量)
- static 修饰的成员变量
- java 反射调用 私有构造类中 private static final 属性的方法
- final、static、static final修饰的字段赋值的区别
- Java_反射_修改final static问题
- final、static、static final修饰引用类型时的区别
- C#代码规范
- 在switch case里使用continue
- Database, UVa 1592
- 简单的页面模板引擎(一)
- 外联结的ON条件与WHERE条件的区别
- 通过反射修改 被 private final static修饰的成员
- Codeforces Round #430 (Div. 2) C. Ilya And The Tree dfs+set
- Oracle优化——外联结的执行计划
- spring_JUnit4测试_通过注解加载xml配置_@RunWith_@ContextConfiguration
- derby数据库源码分析(二)--页面分析
- 善良比聪明重要
- 磁盘控制器驱动程序不对,导致蓝屏
- 基于Android的WiFi聊天系统
- Unity_2D游戏工程的创建_071