反射机制总结----Field

5 篇文章 0 订阅

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值