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

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

1.怎麼經過反射獲取類的屬性數組

     先來看JDK提供的方法有以下幾種:測試

         a)Class.getDeclaredField(String name);this

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

     b)Class.getDeclaredFields();code

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

    c)Class.getField(String name);接口

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

    d)Class.getField();get

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

    來一個例子來講明一下 :

   實體類:

 import java.util.Date;
/**
 * @ClassName: Student
 * @Description: 學生實體
 * @author JoseanLuo  
 * @date 2014-3-18 下午5:17:35
 * @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測試。
 * @author JoseanLuo  
 * @date 2014-3-18 下午5:16:17
 * @version V1.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());
        
}
    
    
}

這個是控制檯輸出:

copyman
private java.lang.Long com.cx.test.Student.id
false
1
private java.lang.String com.cx.test.Student.name
true
Josean
private java.util.Date com.cx.test.Student.createdate
false
Tue Mar 18 18:19:39 CST 2014
private java.lang.String com.cx.test.Student.no
false
201403185203344
public java.lang.String com.cx.test.Student.nickname
false
copyman
名字被我改了,哈哈

是否是以爲很很簡單呢 。

相關文章
相關標籤/搜索