查看对象属性的关键方法是Field类中的get()方法。如果f是一个Field类的对象,obj是某个包含f属性的类的对象实例,那么f.get(obj)将返回一个对象,其值即为f属性的当前值。这样说起来显得有点抽象,看看下面这个实例的运行。
Customer customer = new Customer();
c.setName(“Bonheur ,. Ltd.”);
Class class = customer.getClass();
Field f = class.getDeclaredField(“name”);
Object obj = f.get(customer); //此时obj的为一个值为“Bonheur ,. Ltd.”的字符串。
事实上,这段代码存在一个问题。由于name是一个私有属性,所有get()方法将会抛出一个IIIegalAccessException。只有利用get()方法才能得到可访问属性的值。除非拥有访问权限,否则Java安全机制只允许查看对象有哪些属性,但不允许读取它们的值。Java安全机制默认行为受限于Java的访问控制。然而,如果一个Java程序没有受到安全管理器的控制,就可以覆盖访问控制。为了达到这个目的,需要调用Field、Method或Constructor对象的setAccessible()方法。例如:f.setAccessible(true)。setAccessible()方法是AccessibleObject类中的一个方法,AccessibleObject是Field、Method、Constructor类的父类,这个特性是为调试、持久存储和相似机制提供的。get()方法还有一个需要解决的问题,name属性是一个字符串,因此把它做为Object返回没有什么问题,但如果要取得一个int或double的属性值,get()方法将返回一个Integer或Double的类实例。
当然,可以获得就可以设置,调用f.set(Object obj, Object value)方法可以将obj对象的f属性设置为新值value。
|