动态设置类的私有域
- 实例说明
为了保证面向对象的封装特性,同城会将域设置成私有的,然后提供对应的get和set方法。对于非内部类而言只能使用get和set方法来操作该域。然而利用反射机制,就可以在运行时修改类的私有域。
- 关键技术
Field类提供有关类和接口的单个字段的信息,以及对他的动态访问权限。反射的字段可能是一个类的(静态)字段或实例字段。
Field类的常用字段
- set(Object obj,Object value) 将制定对象变量上次Filed对象表示的字段设置为指定的新值
- setBoolean(Object obj,boolean z) 将字段的值设置为制定对象上的一个Boolean值
- setDouble(Object obj,double d) 将字段的值设置为指定对象上的一个double值
- setInt(Object obj,int i) 将字段的值设置为指定对象上的一个int值
- setAccessible(boolean flag) 将次对象的accessible标志设置为指定字段的值
注意:对于私有域,一定要使用setAccessible()方法将其可见性设置为true才能设置新值
- 设计过程
public class Test { public static void main(String[] args) { Student stu = new Student(); Class<?> cls = stu.getClass(); System.out.println("类的标准名称:" + cls.getCanonicalName()); try { Field id = cls.getDeclaredField("id"); System.out.println("设置前的id:" + stu.getId()); id.setAccessible(true); id.setInt(stu,10); System.out.println("设置后的id:" + stu.getId()); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }