您的位置:首页 > 编程语言 > Java开发

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

2016-09-15 13:55 686 查看
转载自 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 对象所表示的类或接口的所有可访问公共字段。

来一个例子来说明一下 :


实体类:

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

名字被我改了,哈哈
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 反射