在“面试题7”中,已经介绍了我们使用反射的3个步骤,分别是:获取Class对象——>获得构造方法Constructor对象——>调用newInstance方法来创建对象实例。
既然我们已经掌握了如何通过反射获得实例对象的方法。那么,我们如果通过反射去访问属性和方法呢?
【访问属性】
我们可以通过getField和getDeclaredField这两种方法来访问属性,它们之间的差异如下所示:
- getField 只能获取public的,包括从父类继承来的字段。
- getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。(注:这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true))
【访问方法】
我们可以通过getMethod和getDeclaredMethod这两种方法来访问方法,它们之间的差异点参照getField和getDeclaredField。
【访问非public的属性和方法】
如果我们需要访问非public的属性和方法,我们需要为Field或Method实例设置setAccessible(true),否则无法进行访问。
综上所示,我们可以看下面代码示例: