您的位置:首页 > 其它

反射机制总结----Field

2015-04-04 16:42 162 查看
反射机制非常有用,在运行的时候能获取我们需要的信息,下面就Field进行介绍

Field

Field,顾名思义,就是和字段有关的,没错,这个类可以帮助我们获取类里面和成员变量有关的信息

如果我们要获取一个类中的成员变量信息,那么,首先我们需要获取这个类的class对象(获取class方法)

Class clazz = TestReflect.class;
接着我们就可以利用clazz来得到Field

这时有两种方式

<span style="font-family: 'Microsoft YaHei'; background-color: rgb(255, 255, 255);">第一种是获取某个</span><span style="font-family: 'Microsoft YaHei'; background-color: rgb(255, 255, 255);">成员变量</span><span style="font-family: 'Microsoft YaHei'; background-color: rgb(255, 255, 255);">的Field对象,参数为</span><span style="font-family: 'Microsoft YaHei'; background-color: rgb(255, 255, 255);">成员变量</span><span style="font-family: 'Microsoft YaHei'; background-color: rgb(255, 255, 255);">名</span>


第二种是获取这个类中的所有成员变量的Field对象

第一种方式

Field field = clazz.getField("field1");


当我们只需要获取某个成员变量的信息时,用这种方式即可,获取之后可以通过下列方式来获取成员变量的值

System.out.println(field.get(clazz.newInstance()));
get需要传入这个类对应的对象,由于我们一开始获取了class对象,那么使用newInstance方法便可以获得到该类的对象

Field当中还有许多获取的方法,如getInt,getDouble,getChar等等,和数据类型对应,如果是String类型的话只能用get来获取

注意:

1.一般类中的成员变量都有初始值的,如果类中的成员变量没有指定初始化,那么使用该方式获取的值是是会得到初始值,但是如果是使用get来获取String的话是没有初始值的(得到是null)

2.另外,使用这种方式是无法获取私有变量的,如果获取的变量是私有变量的话会报错

如果想访问私有的变量,那么需要使用下面的方式(field2在类中是私有变量)

Field field = clazz.getDeclaredField("field2");
field.setAccessible(true);
两条代码都不能少,如果少了第二条还是会报错

这样就是获取私有变量的值了

第二种方式

Field[] fields = clazz.getFields();


getFields只能获取公有的变量,不能获取私有的变量,如果要获取私有的变量,可以用如下语句
Field field = clazz.getDeclaredFields("field2");
这样就能获取所有在类中声明的变量了(但是访问值的时候还是需要使用setAccessible设置为true)

下面用这种方式来打印出所有的变量名字和类型
for(int i = 0;i < fields.length;i++){
	fields[i].setAccessible(true);
	System.out.println(fields[i].getType() + "  " + fields[i].getName() + " =  " + fields[i].get(clazz.newInstance()));
}

输出如下
int field1 = 0

int field2 = 2

int field3 = 3
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: