首先必須明一點 Field類主要是用來輔助獲取和操做類的屬性的!java
1.怎麼經過反射獲取類的屬性數組
先來看JDK提供的方法有以下幾種:測試
a)Class.getDeclaredField(String name);
this
返回一個
spaField
對象,該對象反映此 Class
對象所表示的類或接口的指定已聲明字段。
codeb)Class.getDeclaredFields();
對象 返回
Field
對象的一個數組,這些對象反映此 Class
對象所表示的類或接口所聲明的全部字段。
c)
接口Class.getField(String name)
;
返回一個
ipField
對象,它反映此 Class
對象所表示的類或接口的指定公共成員字段。
d)
get
;Class.getField()
返回一個包含某些 Field
對象的數組,這些對象反映此 Class
對象所表示的類或接口的全部可訪問公共字段。
來一個例子來講明一下 :
實體類:
import java.util.Date; /** * @ClassName: Student * @Description: 學生實體 * @author JoseanLuo * @date 2014-3-18 下午5:17:35 * @version V1.0 */ public class Student { private Long id; private String name; private Date createdate; private String no; public String nickname; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getCreatedate() { return createdate; } public void setCreatedate(Date createdate) { this.createdate = createdate; } public String getNo() { return no; } public void setNo(String no) { this.no = no; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } }
測試類:
import java.lang.reflect.Field; import java.util.Date; /** * @ClassName: ReflectFieldTest * @Description: 反射Field測試。 * @author JoseanLuo * @date 2014-3-18 下午5:16:17 * @version V1.0 */ public class ReflectFieldTest { public static void main(String[] args) { Student stu=new Student(); stu.setId(1L); stu.setName("Josean"); stu.setNo("201403185203344"); stu.setCreatedate(new Date()); try { Field property1=stu.getClass().getDeclaredField("name"); System.out.println(property1);//private java.lang.String com.cx.test.Student.name Field property3=stu.getClass().getField("nickname"); System.out.println(property3);//public java.lang.String com.cx.test.Student.nickname //錯誤方法 getField系列方法只能獲取公共字段 //Field property2=stu.getClass().getField("name"); //System.out.println(property2); //會拋java.lang.NoSuchFieldException } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } }
2.進行屬性獲取更改
獲得這個Field以後你就能夠獲取他的值或者設置他的值了。
獲取他的值用get類型方法,他針對常見類型提供了對應get方法,這裏就不一一列舉了。
值得注意的是獲取私有屬性的時候必須先設置Accessible爲true,而後才能獲取。
同理設置的時候調用set類型方法,這裏也不一一列舉了,下面放代碼。
import java.lang.reflect.Field; import java.util.Date; /** * @ClassName: ReflectFieldTest * @Description: 反射Field測試。 * @author JoseanLuo * @date 2014-3-18 下午5:16:17 * @version V1.0 */ public class ReflectFieldTest { public static void main(String[] args) throws Exception { Student stu=new Student(); stu.setId(1L); stu.setName("Josean"); stu.setNo("201403185203344"); stu.setCreatedate(new Date()); stu.setNickname("copyman"); Field property1=stu.getClass().getDeclaredField("name"); //System.out.println(property1);//out:private java.lang.String com.cx.test.Student.name Field property3=stu.getClass().getField("nickname"); System.out.println(property3.get(stu)); //System.out.println(property3);//out:public java.lang.String com.cx.test.Student.nickname //錯誤方法 getField系列方法只能獲取公共字段 //Field property2=stu.getClass().getField("name"); //System.out.println(property2); //會拋java.lang.NoSuchFieldException Field [] prFields4=stu.getClass().getDeclaredFields(); for(Field field:prFields4) { System.out.println(field); System.out.println(field.equals(property1)); //私有變量必須先設置Accessible爲true field.setAccessible(true); //獲取用get類方法。 System.out.println(field.get(stu)); } //設置用set類方法 property3.set(stu, "名字被我改了,哈哈"); System.out.println(stu.getNickname()); } }
這個是控制檯輸出:
copyman private java.lang.Long com.cx.test.Student.id false 1 private java.lang.String com.cx.test.Student.name true Josean private java.util.Date com.cx.test.Student.createdate false Tue Mar 18 18:19:39 CST 2014 private java.lang.String com.cx.test.Student.no false 201403185203344 public java.lang.String com.cx.test.Student.nickname false copyman 名字被我改了,哈哈
是否是以爲很很簡單呢 。