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

来源:互联网 发布:c语言 用牛顿迭代法 编辑:程序博客网 时间:2024/04/30 03:56

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; 
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; 
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; 


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


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 

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 
名字被我改了,哈哈


0 0
原创粉丝点击