动态设置类的私有域

  • 实例说明

  为了保证面向对象的封装特性,同城会将域设置成私有的,然后提供对应的get和set方法。对于非内部类而言只能使用get和set方法来操作该域。然而利用反射机制,就可以在运行时修改类的私有域。

  • 关键技术

  Field类提供有关类和接口的单个字段的信息,以及对他的动态访问权限。反射的字段可能是一个类的(静态)字段或实例字段。

  Field类的常用字段

  1. set(Object obj,Object value)  将制定对象变量上次Filed对象表示的字段设置为指定的新值
  2. setBoolean(Object obj,boolean z)  将字段的值设置为制定对象上的一个Boolean值
  3. setDouble(Object obj,double d)  将字段的值设置为指定对象上的一个double值
  4. setInt(Object obj,int i)  将字段的值设置为指定对象上的一个int值
  5. 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();
        }
    }
}

 

posted @ 2019-09-12 16:41  Joy丨windy  阅读(242)  评论(0编辑  收藏  举报