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 }
     
  • 相关阅读:
    未能加载文件或程序集“*.DALSQLServer”的原因和解决办法
    删除数据库重复数据一方法
    未能加载文件或程序集 System.Web.Extensions 的解决办法
    3D电影的原理
    语法分析器自动生成工具一览
    【翻译】语法分析工具Gold介绍(1)——系统简介
    安装版本管理软件SVN
    在Visual Studio 2008(及以后版本)中使用SVN
    20191218《信息安全导论》第四周总结
    20191218 唐启恒 师生关系
  • 原文地址:https://www.cnblogs.com/the-wang/p/7154609.html
Copyright © 2011-2022 走看看