field 屬性操作


首先必須明一點 Field類主要是用來輔助獲取和操作類的屬性的

1.怎么通過反射獲取類的屬性

     先來看JDK提供的方法有如下幾種:

         a)Class.getDeclaredField(String name);

     返回一個 Field 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明字段

     b)Class.getDeclaredFields();

      返回 Field 對象的一個數組,這些對象反映此 Class 對象所表示的類或接口所聲明的所有字段

    c)Class.getField(String name);

       返回一個 Field 對象,它反映此 Class 對象所表示的類或接口的指定公共成員字段

    d)Class.getField();

              返回一個包含某些 Field 對象的數組,這些對象反映此 Class 對象所表示的類或接口的所有可訪問公共字段

    來一個例子來說明一下 :

   實體類:

 

 1  import java.util.Date;
 2 /**
 3  * @ClassName: Student
 4  * @Description: 學生實體
 5  * @author JoseanLuo  
 6  * @date 2014-3-18 下午5:17:35
 7  * @version V1.0 
 8  */
 9 public class Student
10 {
11   private Long id;
12   private String name;
13   private Date createdate;
14   private String no;
15   public String nickname;
16 public Long getId()
17 {
18     return id;
19 }
20 public void setId(Long id)
21 {
22     this.id = id;
23 }
24 public String getName()
25 {
26     return name;
27 }
28 public void setName(String name)
29 {
30     this.name = name;
31 }
32 public Date getCreatedate()
33 {
34     return createdate;
35 }
36 public void setCreatedate(Date createdate)
37 {
38     this.createdate = createdate;
39 }
40 public String getNo()
41 {
42     return no;
43 }
44 public void setNo(String no)
45 {
46     this.no = no;
47 }
48 public String getNickname()
49 {
50     return nickname;
51 }
52 public void setNickname(String nickname)
53 {
54     this.nickname = nickname;
55 }
56   
57 }

  測試類:

 1 import java.lang.reflect.Field;
 2 import java.util.Date;
 3 /**
 4  * @ClassName: ReflectFieldTest
 5  * @Description: 反射Field測試。
 6  * @author JoseanLuo  
 7  * @date 2014-3-18 下午5:16:17
 8  * @version V1.0 
 9  */
10 public class ReflectFieldTest
11 {
12  
13     public static void main(String[] args)
14 {    Student stu=new Student();
15      stu.setId(1L);
16      stu.setName("Josean");
17      stu.setNo("201403185203344");
18      stu.setCreatedate(new Date());
19      try
20     {
21         Field property1=stu.getClass().getDeclaredField("name");
22         System.out.println(property1);//private java.lang.String com.cx.test.Student.name
23         Field property3=stu.getClass().getField("nickname");
24         System.out.println(property3);//public java.lang.String com.cx.test.Student.nickname
25         //錯誤方法 getField系列方法只能獲取公共字段
26         //Field property2=stu.getClass().getField("name");
27         //System.out.println(property2);
28         //會拋java.lang.NoSuchFieldException
29         
30         
31     } catch (SecurityException e)
32     {
33         
34         e.printStackTrace();
35     } catch (NoSuchFieldException e)
36     {
37         
38         e.printStackTrace();
39     }
40 }
41     
42     
43 }

2.進行屬性獲取更改

   得到這個Field之后你就可以獲取他的值或者設置他的值了。

   獲取他的值用get類型方法,他針對常見類型提供了對應get方法,這里就不一一列舉了。

   值得注意的是獲取私有屬性的時候必須先設置Accessible為true,然后才能獲取。

   同理設置的時候調用set類型方法,這里也不一一列舉了,下面放代碼。

 

 1 import java.lang.reflect.Field;
 2 import java.util.Date;
 3 /**
 4  * @ClassName: ReflectFieldTest
 5  * @Description: 反射Field測試。
 6  * @author JoseanLuo  
 7  * @date 2014-3-18 下午5:16:17
 8  * @version V1.0 
 9  */
10 public class ReflectFieldTest
11 {
12  
13     public static void main(String[] args) throws Exception
14 {    Student stu=new Student();
15      stu.setId(1L);
16      stu.setName("Josean");
17      stu.setNo("201403185203344");
18      stu.setCreatedate(new Date());
19      stu.setNickname("copyman");
20         Field property1=stu.getClass().getDeclaredField("name");
21         //System.out.println(property1);//out:private java.lang.String com.cx.test.Student.name
22         Field property3=stu.getClass().getField("nickname");
23         System.out.println(property3.get(stu));
24         //System.out.println(property3);//out:public java.lang.String com.cx.test.Student.nickname
25         //錯誤方法 getField系列方法只能獲取公共字段
26         //Field property2=stu.getClass().getField("name");
27         //System.out.println(property2);
28         //會拋java.lang.NoSuchFieldException
29         Field [] prFields4=stu.getClass().getDeclaredFields();
30         for(Field field:prFields4)
31         {
32             System.out.println(field);
33             System.out.println(field.equals(property1));
34             //私有變量必須先設置Accessible為true
35             field.setAccessible(true);
36             //獲取用get類方法。
37             System.out.println(field.get(stu));
38         }
39         //設置用set類方法
40         property3.set(stu, "名字被我改了,哈哈");
41          
42         System.out.println(stu.getNickname());
43         
44 }
45     
46     
47 }

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM