Field类提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)变量或实例变量。利用Class对象的方法可以获得属性类对象(即Field对象),有了Field对象,就可以获得和设置属性。需要注意的是,属性如果是私有的,需要设置跳过安全检查,即对Field对象调用set Accessible(true)方法。
【例12-3】
演示利用反射机制操作属性。
在chapter12项目src目录的cn.linaw.chapter12.demo01包下创建一个Field Test测试类,如图12-5所示。
图12-5 通过反射操作属性
(1)程序第7行通过Class类的for Name方法获取指定类的Class对象。
(2)程序第11行利用Class对象获得此类所有已声明字段的Field对象数组。
方法public Field[]get Declared Fields()throws Security Exception返回一个表示此类所有已声明字段的Field对象的数组,这些对象反映此Class对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何字段,或者此Class对象表示一个基本类型、一个数组类或void,则此方法返回一个长度为0的数组。
(3)程序第12~14行打印Field对象数组的每一个Field对象,调用该对象的public String toString()方法,该方法返回一个描述此Field的字符串。格式是:该字段(如果存在的话)的访问修饰符,后面跟着字段类型和一个空格,再后面是声明该字段的类的完全限定名,后面跟着一个句点,最后是字段的名称。
(4)程序第18行利用Class对象的newInstance()方法创建此Class对象所表示的类的一个新实例。如同用一个带有一个空参数列表的new表达式实例化该类。(www.xing528.com)
(5)程序第19行利用Class对象的getDeclaredField方法获取一个指定属性的Field对象。
方法public Field get Declared Field(String name)throws NoSuch Field Exception,Security Exception返回一个此类中指定属性的Field对象,该对象反映此Class对象所表示的类或接口的指定已声明属性。name参数为指定属性的名称。
(6)程序第20行set Accessible方法继承自父类java.lang.reflect.AccessibleObject。
方法public void set Accessible(boolean flag)throws Security Exception将此对象的accessible标志设置为指示的布尔值。值为true则指示反射的对象在使用时应该取消Java语言访问检查。值为false则指示反射的对象应该实施Java语言访问检查。
(7)程序第21行调用Field对象的set方法设置指定对象的属性。
方法public void set(Object obj,Object value)throws Illegal Argument Exception,Illegal AccessException将指定对象变量上此Field对象表示的属性设置为指定的新值。如果底层属性的类型为基本类型,则对新值进行自动拆箱。参数obj表示应该修改其属性的对象,value为正被修改obj的属性的新值。
注意:
开发中不推荐使用跳过安全检查来访问私有属性和方法,应该通过公共的set方法和get方法来操作属性。
(8)程序第25行打印利用反射修改属性值后的对象。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。