之前我写了《java创建对象除了new,还有其他办法吗?》、《什么?java方法还可以这样调用》、《私有方法?我照样要访问》这三篇文章,描述了通过java反射创建对象以及调用方法,有兴趣的朋友可以翻阅一下。
今天我再来写写怎么通过反射操作字段吧。老规矩,先上我们要操作的类的代码。
这个demo类比较简单,一个非静态的字段name,一个静态的字段staticName,都赋值了初始值。下面我们来聊聊怎么通过反射对着俩字段进行读写。
非静态字段的读写
先来看看怎么通过反射对非静态字段进行读取的操作吧,废话不多说,上代码。
看看是不是和前面文章中讲的获取方法有些类似,通过“getDeclaredField”方法就可以获取到字段了。要读取字段的值,那就需要调用这个字段的“get”方法了。那是要读取那个对象的这个字段值呢,就需要通过调用“get”方法的时候通过参数来说明了。执行一下,验证看看能不能读取到字段的值呢。
ps:大家有没有注意到“nameField.setAccessible(true)”这句,还不清楚这句含义的朋友,翻阅一下我前面的文章《私有方法?我照样要访问》吧。
获取到了这个初始值了呢。读取字段值是通过“get”方法,那给这个字段赋值会不会是“set”方法呢,我们来试试看吧。继续上下一道代码。
这段代码使用了字段(Field对象)的set方法进行赋值。set方法有两个参数,第一个参数是字段所属对象,第二个参数为要给字段赋值的内容。
这里赋值后,我又做了一下读取并输出,用来验证一下是不是为字段赋值成功。
一起来看下执行结果吧。
从执行结果来看是成功完成对字段的赋值了。
静态字段的读写
有了上面的例子,和前面几篇文章,想必大家已经知道怎么通过反射对静态字段进行读写了,一起来看看下面的代码是不是你想的那样呢。
这里就不再分两次说明了,把读写都写在一起了。先通过反射读取原始初始化的内容,然后通过反射赋新值,最后通过反射读取新值,并输出。
这段代码中想必大家已经注意到了,对静态字段做读写操作,调用get、set方法时需要传字段所属对象的参数传null即可。因为静态字段是不属于对象的,是属于这个类的。
看看执行结果,是不是我们预想的样子吧。
执行完成,与我们的预期是一样的。
好了,今天的内容就到这里。