概述
首先必须明一点 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
对象所表示的类或接口的所有可访问公共字段。
来一个例子来说明一下 :
实体类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
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;
}
}
|
测试类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
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类型方法,这里也不一一列举了,下面放代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
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());
}
}
|
这个是控制台输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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反射系列之Field,java.lang.reflect.Field使用获取方法。的全部内容,希望文章能够帮你解决JAVA反射系列之Field,java.lang.reflect.Field使用获取方法。所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复