反射机制非常有用,在运行的时候能获取我们需要的信息,下面就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