首页 > 代码库 > JAVA反射系列之Field,java.lang.reflect.Field使用获取方法

JAVA反射系列之Field,java.lang.reflect.Field使用获取方法

JAVA反射系列之Field,java.lang.reflect.Field使用获取方法。   转载https://my.oschina.net/u/1407116/blog/209383
摘要
java.lang.reflect.Field使用 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 对象所表示的类或接口的所有可访问公共字段

    来一个例子来说明一下 :

   实体类:

 import java.util.Date;/** * @ClassName: Student * @Description: 学生实体   * @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测试。 * @version V2.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());        }        }

这个是控制台输出:

copymanprivate java.lang.Long com.cx.test.Student.idfalse1private java.lang.String com.cx.test.Student.nametrueJoseanprivate java.util.Date com.cx.test.Student.createdatefalseTue Mar 18 18:19:39 CST 2014private java.lang.String com.cx.test.Student.nofalse201403185203344public java.lang.String com.cx.test.Student.nicknamefalsecopyman名字被我改了,哈哈

JAVA反射系列之Field,java.lang.reflect.Field使用获取方法