zoukankan      html  css  js  c++  java
  • 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 }
     
  • 相关阅读:
    CodeForces Gym 100935G Board Game DFS
    CodeForces 493D Vasya and Chess 简单博弈
    CodeForces Gym 100935D Enormous Carpet 快速幂取模
    CodeForces Gym 100935E Pairs
    CodeForces Gym 100935C OCR (水
    CodeForces Gym 100935B Weird Cryptography
    HDU-敌兵布阵
    HDU-Minimum Inversion Number(最小逆序数)
    七月馒头
    非常可乐
  • 原文地址:https://www.cnblogs.com/the-wang/p/7154609.html
Copyright © 2011-2022 走看看