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 查看本文章
来一个例子来说明一下 :
实体类:
-
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
-
名字被我改了,哈哈