java.lang.reflect.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 对象所表示的类或接口的所有可访问公共字段。

扫描二维码关注公众号,回复: 3024848 查看本文章

    来一个例子来说明一下 :

   实体类:

  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. }

这个是控制台输出:

  1. copyman
  2. private java.lang.Long com.cx.test.Student.id
  3. false
  4. 1
  5. private java.lang.String com.cx.test.Student.name
  6. true
  7. Josean
  8. private java.util.Date com.cx.test.Student.createdate
  9. false
  10. Tue Mar  18  18: 19: 39 CST  2014
  11. private java.lang.String com.cx.test.Student.no
  12. false
  13. 201403185203344
  14. public java.lang.String com.cx.test.Student.nickname
  15. false
  16. copyman
  17. 名字被我改了,哈哈
是不是觉得很很简单呢 。

猜你喜欢

转载自blog.csdn.net/tectrol/article/details/80875789
今日推荐